列表之间的组合忽略对内的元素并列出并忽略对的排序

时间:2018-05-28 17:27:58

标签: python combinations

我有两个清单:

list1=['a', 'z', 'd', 'e','b']
list2=['d','e', 'b' ]

我需要这两个列表元素的组合(而不是排列)。我尝试了itertools.combinationsitertools.product,但我没有得到我想要的。例如,('d','d')会出错。 ('a','z')也是错误的,因为'a''z'属于同一个列表(list1),而list2中没有一个列表出现在('d','e')中。最后,我不希望('e','d')('a','d'), ('a','e'), ('a','b'), ('z','d'), ('z','e'), ('z','b'), ('d','e'), ('d','b'), ('e','b') - 只有其中一对,因为顺序并不重要。理想的输出是:

list2

编辑:通常,list1并不总是.container { margin: 40px; background-color: grey; height: 380px; width: 250px; position: absolute; } .box { height: 100px; width: 250px; transform: skewY(-10deg); } #red{ margin-top: 20px; }的子集,但我也想处理这种情况。这两个列表也可能存在重叠,而不是完整的子集。

5 个答案:

答案 0 :(得分:2)

由于顺序无关紧要,因此您应该使用setfrozenset作为与订单无关的集合。

一个强力解决方案是使用itertools.product,但使用set结合列表解析来删除重复项:

from itertools import product

list1=['a', 'z', 'd', 'e','b']
list2=['d','e', 'b' ]

res = [i for i in set(map(frozenset, product(list1, list2))) if len(i) > 1]

print(res)

[frozenset({'b', 'e'}),
 frozenset({'a', 'e'}),
 frozenset({'d', 'z'}),
 frozenset({'b', 'd'}),
 frozenset({'a', 'd'}),
 frozenset({'d', 'e'}),
 frozenset({'b', 'z'}),
 frozenset({'a', 'b'}),
 frozenset({'e', 'z'})]

答案 1 :(得分:2)

效率可能不高,但您可以尝试以下方法:

list1=['a', 'z', 'd', 'e','b']
list2=['d','e', 'b' ]

result = []
for i in list1:
    for j in list2:
        if i != j and (j,i) not in result:
            result.append((i,j))
print(result)

结果:

[('a', 'd'), ('a', 'e'), ('a', 'b'), 
 ('z', 'd'), ('z', 'e'), ('z', 'b'), 
 ('d', 'e'), ('d', 'b'), ('e', 'b')]

答案 2 :(得分:1)

from itertools import chain, product, combinations
common = set(list1) & set(list2)
sdiff = set(list1) ^ set(list2)
result = [i for i in chain(product(common, sdiff), combinations(common, 2))]

然后,

>>> print(a)
[('b', 'a'), ('b', 'z'), ('e', 'a'), ('e', 'z'), ('d', 'a'), ('d', 'z'), ('b', 'e'), ('b', 'd'), ('e', 'd')]

答案 3 :(得分:1)

您可以通过对内部元组进行排序来处理('d', 'e')('e', 'd')等示例:

from itertools import product

xs = ['a', 'z', 'd', 'e', 'b']
ys = ['d', 'e', 'b']

got = set(tuple(sorted(t)) for t in product(xs, ys) if t[0] != t[1])

答案 4 :(得分:0)

效率低下,但工作:

print(set([z for x in list1 for z in [tuple(x+y) if ord(x) < ord(y) else tuple(y+x) for y in list2 if x != y]]))

{('a','e'),('e','z'),('b','z'),('d','e'),('a',' b'),('b','d'),('b','e'),('d','z'),('a','d')}

我真的更喜欢@jpp解决方案!