问题描述
我正在尝试查找集合的所有可能组合。假设我有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)
尝试一下,我认为应该这样做