列举所有可能的情况

问题描述

我正在尝试查找集合的所有可能组合。假设我有2辆车(A和B),我想通过发送然后返回来使用它们。发送和返回是两个截然不同的动作,我想列举发送和返回该车辆的所有可能顺序。因此,集合为[A,A,B,B]。我用下面的代码来枚举:

from itertools import permutations 

a = permutations(['A','A','B','B']) 
   
# Print the permutations
seq = []
for i in list(a):
    seq.append(i)
seq = list(set(seq)) # remove duplicates

结果如下:

('A','A')
('A','B')
('A','B')
('B','A')
('B','B')

假设我的假设是两辆车是相同的。因此,哪个是一阶都没关系(即ABBA与BAAB相同)。我期望的结果是:

 ('A','A')
 ('A','B')
 ('A','B')

我可以通过删除最后三个元素轻松地做到这一点。但是,当我尝试对三辆车执行相同的操作时遇到一个问题(a =排列(['A','A','B','B','C','C'])。确保结果已经考虑了三辆相同的车辆?

解决方法

一种方法是生成所有组合,然后仅过滤每辆车的第一个提及字母的那些组合。

在最新版本的Python中,dict保留了第一次插入的顺序,因此我们可以使用它来确定第一次提及的顺序;像这样:

from itertools import permutations 

seq = set()
for i in permutations(['A','A','B','B']):
    first_mentions = {car: None for car in i}.keys()
    if list(first_mentions) == sorted(first_mentions):
        seq.add(i)

(从Python 3.5开始在实践中有效,从Python 3.7开始正式使用)

,

from itertools import permutations 

a = permutations(['A','B']) 
   
seq = []
for i in list(a):
    if i[0]=='A':
        seq.append(i)
seq = list(set(seq))
print(seq)

尝试一下,我认为应该这样做