配对嵌套列表中的元素

时间:2017-09-11 07:19:22

标签: 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 range(len(x):
         if i!= j:
             #TODO...
             print(x[i], x[j])

我的问题是:是否有更聪明的方法来提高性能? (当x有6-7个项目时,我可以告诉它减慢很多)。

您的任何输入都会对我有所帮助。

由于

3 个答案:

答案 0 :(得分:4)

使用itertools.permutations

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
相关问题