3 回答

TA貢獻2065條經(jīng)驗 獲得超14個贊
以下代碼生成最后一個n-1
數(shù)字的所有排列,并在每個排列之前加上原始列表的第一個元素。
from itertools import permutations circular_perms = [my_list[:1]+list(perm) for perm in permutations(my_list[1:])]
my_list
您要生成其所有循環(huán)排列的值的初始列表在哪里。

TA貢獻1815條經(jīng)驗 獲得超10個贊
當(dāng)您有一個由N個元素組成的列表時,該列表的一個循環(huán)排列由其第一個元素唯一地給出。Than表示您將具有正好N個循環(huán)排列(包括原始列表),并且可以通過刪除fist元素并將其添加到列表的末尾從一個傳遞到另一個。
您可以輕松地為列表的所有循環(huán)排列構(gòu)建一個生成器:
def circ_perm(lst):
cpy = lst[:] # take a copy because a list is a mutable object
yield cpy
for i in range(len(lst) - 1):
cpy = cpy[1:] + [cpy[0]]
yield cpy
演示:
>>> list(circ_perm([1,2,3,4]))
[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]
如果您想要的是唯一的排列(當(dāng)兩個排列是另一個排列的排列)時,您仍然可以使用以下事實:循環(huán)排列由其第一個元素給出,并固定第一個元素,并找到剩下的所有排列:
def uniq_perm(lst):
gen = itertools.permutations(lst[1:])
for end in gen:
yield [lst[0]] + list(end)
演示:
>>> list(uniq_perm([1,2,3,4]))
[[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2]]

TA貢獻2080條經(jīng)驗 獲得超4個贊
進行排列的復(fù)雜度約為O(n * n?。?,因此對于大數(shù)或列表而言,生成所有可能的排列效率低下,您可以使用回溯來生成列表排列,我將分享一個鏈接,可能會有所幫助。 該解決方案基于回溯
def permute(a, l, r):
if l == r:
print(a)
else:
for i in range(l, r + 1):
a[l], a[i] = a[i], a[l]
permute(a, l + 1, r)
a[l], a[i] = a[i], a[l]
data = [1,2,3,4,5]
n = len(data)
a = list(data)
permute(a, 0, n - 1)
添加回答
舉報