我有两个清单:
list1=['a', 'z', 'd', 'e','b']
list2=['d','e', 'b' ]
我需要这两个列表元素的组合(而不是排列)。我尝试了itertools.combinations
和itertools.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;
}
的子集,但我也想处理这种情况。这两个列表也可能存在重叠,而不是完整的子集。
答案 0 :(得分:2)
由于顺序无关紧要,因此您应该使用set
或frozenset
作为与订单无关的集合。
一个强力解决方案是使用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解决方案!