生成相同项目的索引的排列

时间:2018-01-14 09:00:56

标签: python indexing permutation

我有一个清单

a = ['A', 'B', 'A', 'A', 'C']

我希望为列表中相同的项目生成所有可能的项目索引排列

[0,1,2,3,4]
[2,1,0,3,4]
[3,1,2,0,4]
[0,1,3,2,4]
[2,1,3,0,4]
[3,1,0,2,4]

如何以最pythonic的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

from itertools import permutations

length = 5
p = permutations(range(1, length+1), length)
for i in p:
    print(i)

UPD:这适用于所有列表,不适用于相同的项目。

你可能会发现这样的非独特元素:

import collections

list = ['A', 'B', 'A', 'A', 'C']
non_unique = [item for item, count in collections.Counter(list).items() if count > 1]
print(non_unique)

然后结合这两个部分,如果代码,让我想一想......

几乎已经完成了解决方案

import collections
from itertools import permutations

my_list = ['A', 'B', 'A', 'A', 'C']
non_unique = [item for item, count in collections.Counter(my_list).items() if count > 1]
print(non_unique)

non_unique_enum = []
for filter_value in non_unique:
    non_unique_enum.append([(index, value) for index, value in enumerate(my_list) if value == filter_value])

for row in non_unique_enum:
    p = permutations([item[0] for item in row], len(row))
    print(row)
    for item in p:
        print(item)

输出:

['A']
[(0, 'A'), (2, 'A'), (3, 'A')]
(0, 2, 3)
(0, 3, 2)
(2, 0, 3)
(2, 3, 0)
(3, 0, 2)
(3, 2, 0)

您所要做的就是将这些索引与静态元素索引混合在一起。如果您有多个非唯一字母,例如

,它也可以使用
my_list = ['A', 'B', 'A', 'A', 'C', 'B']