Python 在嵌套列表中配对元素

Python 在嵌套列表中配对元素,python,python-3.x,list,nested-lists,Python,Python 3.x,List,Nested Lists,我有一张这样的清单 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

我有一张这样的清单

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个项目时,我可以看出它会慢很多)

你的任何意见都会对我有很大帮助

谢谢

使用:

如评论所述,对于特定的顺序,您可以使用:

给了我一个有趣的想法。在这里,使用
itertools.combinations
,它按您要查找的顺序返回项目

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]
,这是您的实际列表



注意:在python上,您可以尝试
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

如果您想获得OP指定的顺序,可能最简单的方法是使用基于
组合的方法,将每个组合向前和向后。您介意删除组合方法吗?这和我的答案是一样的。不完全一样,你能扩展你的吗?我不这么认为?牺牲可读性来将其放在一行中不是一个好主意。这个想法不是将其放在一行中,而是使用
itertools
为什么
。\uuuu len\uuuuu
而不是
len()
x.\uu len\uuuu()
?使用
len(x)
better@COLDSPEED我发现你的解决方案真的很容易阅读,适合我的需要。Thanks@ryanvolap很乐意帮忙。干杯
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 = [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