以所有可能的排列替换列表中的项目

时间:2017-12-27 14:19:17

标签: python list permutation

我们说我有一个列表或类型数组:

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的排列。

2 个答案:

答案 0 :(得分:3)

使用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]

答案 1 :(得分:0)

您可以创建一个函数,只需将列表和值传递给该函数,即可获得所需内容:

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]]