我有一个像这样的列表列表。
a = [1, 2, 3, 4]
b = [3, 2, 0.3]
c = [0.1, 3, 6.8]
d = [9, 2.5, 7, 2]
x = [a, b, c, d]
我想像这样配对:
[a, b], [b, a], [a, c], [c, a], [a, d], [d, a], [b, c], [c, b], [b, d], [d, b], [c, d], [d, c]
这就是我这样做的方式:
for i in range(len(x)):
for j in range(len(x):
if i!= j:
#TODO...
print(x[i], x[j])
我的问题是:是否有更聪明的方法来提高性能? (当x有6-7个项目时,我可以告诉它减慢很多)。
您的任何输入都会对我有所帮助。
由于
答案 0 :(得分:4)
a = [1, 2, 3, 4]
b = [3, 2, 0.3]
c = [0.1, 3, 6.8]
d = [9, 2.5, 7, 2]
x = [a, b, c, d]
import itertools
list(itertools.permutations(x, 2))
[([1, 2, 3, 4], [3, 2, 0.3]), ([1, 2, 3, 4], [0.1, 3, 6.8]), ([1, 2, 3, 4], [9, 2.5, 7, 2]), ([3, 2, 0.3], [1, 2, 3, 4]), ([3, 2, 0.3], [0.1, 3, 6.8]), ([3, 2, 0.3], [9, 2.5, 7, 2]), ([0.1, 3, 6.8], [1, 2, 3, 4]), ([0.1, 3, 6.8], [3, 2, 0.3]), ([0.1, 3, 6.8], [9, 2.5, 7, 2]), ([9, 2.5, 7, 2], [1, 2, 3, 4]), ([9, 2.5, 7, 2], [3, 2, 0.3]), ([9, 2.5, 7, 2], [0.1, 3, 6.8])]
正如评论所说,对于特定订单,您可以使用itertools.combinations
:
list(itertools.chain.from_iterable(map(lambda x: (x, x[::-1]),
itertools.combinations(x, 2))))
[([1, 2, 3, 4], [3, 2, 0.3]), ([3, 2, 0.3], [1, 2, 3, 4]), ([1, 2, 3, 4], [0.1, 3, 6.8]), ([0.1, 3, 6.8], [1, 2, 3, 4]), ([1, 2, 3, 4], [9, 2.5, 7, 2]), ([9, 2.5, 7, 2], [1, 2, 3, 4]), ([3, 2, 0.3], [0.1, 3, 6.8]), ([0.1, 3, 6.8], [3, 2, 0.3]), ([3, 2, 0.3], [9, 2.5, 7, 2]), ([9, 2.5, 7, 2], [3, 2, 0.3]), ([0.1, 3, 6.8], [9, 2.5, 7, 2]), ([9, 2.5, 7, 2], [0.1, 3, 6.8])]
答案 1 :(得分:4)
This comment给了我一个有趣的想法。在这里,使用 from itertools import combinations
def foo(x):
for x in combinations(x, 2):
yield from (x, x[::-1]) # python3.3+
for i in foo(['a', 'b', 'c', 'd']):
print(i)
('a', 'b')
('b', 'a')
('a', 'c')
('c', 'a')
('a', 'd')
('d', 'a')
('b', 'c')
('c', 'b')
('b', 'd')
('d', 'b')
('c', 'd')
('d', 'c')
,它会按照您要查找的顺序返回商品。
['a', 'b', 'c', 'd']
将[a, b, c, d]
替换为yield x; yield x[::-1]
,这是您的实际列表清单。
注意:在python< 3.3上,您需要yield from
,因为{{1}}不受支持。
答案 2 :(得分:0)
您可以尝试zip
:
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
x = [a,b,c]
y = []
for i in range (0,len(x)):
for j in range (i + 1, len(x)):
y.append(zip(x[i],x[j]))
y.append(zip(x[j],x[i]))
print y