在所有可能的排列

名单更换项目比方说,我有一个列表或类型的数组:在所有可能的排列

mylist = [1, 2, 3, 4] 

而且我要在此列表中替换的项目。通常我会使用类似以下的东西:

mylist[2] = 7 

这很好。但是,有人可以解释如何在替换mylist中的一个或多个项目时创建所有可能的mylist排列。例如,我想创建以下文件:

[7, 2, 3, 4] 

[7, 7, 3, 4]

[7, 2, 7, 4]

[7, 7, 7, 4]

[7, 2, 3, 7]

...(and so on)

我知道我可以使用itertools生成所有可能的排列,但我怎么可以指定我想在列表生成之前在所有可能的位置取代一个项目排列?这里是我试图用itertools

list(itertools.permutations([1,2,3,4,7], 4)) 

这不起作用,因为它不按置换替代7超过一次,而且它也产生置换不包括数量7

回答:

使用itertools.combinations找到指数更换:

replace = 7 

mylist = [1, 2, 3, 4]

for i in range(1, len(mylist) + 1):

for selected in itertools.combinations(range(len(mylist)), i):

res = mylist[:]

for n in selected:

res[n] = replace

print(res)

输出:

[7, 2, 3, 4] 

[1, 7, 3, 4]

[1, 2, 7, 4]

[1, 2, 3, 7]

[7, 7, 3, 4]

[7, 2, 7, 4]

[7, 2, 3, 7]

[1, 7, 7, 4]

[1, 7, 3, 7]

[1, 2, 7, 7]

[7, 7, 7, 4]

[7, 7, 3, 7]

[7, 2, 7, 7]

[1, 7, 7, 7]

[7, 7, 7, 7]

回答:

您可以创建一个功能,你只需要把这个清单和价值,该功能,你会得到你想要的东西:

import itertools 

def replaced_it(list_1,value):

final_list = []

len_=len(list_1)

track_index = [k for k, j in enumerate(list_1)]

for i in range(len(track_index) + 1):

empty_list = [value]

replaced_one = list_1[:]

for ia in itertools.permutations(track_index, r=i):

if ia:

for i, j in zip(ia, empty_list * len(ia)):

replaced_one[i] = j

if replaced_one not in final_list:

final_list.append(replaced_one)

replaced_one = list_1[:]

return final_list

print(replaced_it([1,2,3,4],7))

输出:

[[7, 2, 3, 4], [1, 7, 3, 4], [1, 2, 7, 4], [1, 2, 3, 7], [7, 7, 3, 4], [7, 2, 7, 4], [7, 2, 3, 7], [1, 7, 7, 4], [1, 7, 3, 7], [1, 2, 7, 7], [7, 7, 7, 4], [7, 7, 3, 7], [7, 2, 7, 7], [1, 7, 7, 7], [7, 7, 7, 7]] 

以上是 在所有可能的排列 的全部内容, 来源链接: utcz.com/qa/265626.html

回到顶部