如何在Python中组合两个列表的每个元素?

8

我有一个包含多个列表的大列表,我想将它们合并:它看起来有点像这样:

[[1,2,3,4,5], [6,7,8,9,0], [2,5,7,9,4], [4,7,8,43,6]...]

最多可以有大约20个这样的列表。现在我想将第一个列表和第二个列表合并,使其看起来像这样:

[[1,6], [2,7], [3,8], [4,9], [5,0]]

我希望能够再次使用第一和第三个列表,一直到结束。然后从第二个列表开始再做一遍,直到第三、第四行……最后一行(但不包括第一个列表,因为它已经与第一和第二个列表一起完成了)。如何编写代码来实现这一点?
以下是我目前的代码:
xcols = 包含所有类似上面展示的列表的列
def MakeLists(xcols):
    multilist = []
    for i in xcols:
        for j in xcols[index(i):]:
            currentlist = map(list.__add__, i, j)
            multilist.append(currentlist)

但是当我运行它时,会给我一个错误提示,可能是在 map 部分,因为我不知道如何先将每个元素转换为列表,然后再映射它们。任何帮助都将不胜感激。谢谢!

5个回答

7
像这样怎么样:
>>> import itertools
>>> foo = [[1, 2, 3], [4, 5, 6], [7, 8, 8]]
>>> for p in itertools.permutations(foo, 2):
...     print zip(*p)
... 
[(1, 4), (2, 5), (3, 6)]
[(1, 7), (2, 8), (3, 8)]
[(4, 1), (5, 2), (6, 3)]
[(4, 7), (5, 8), (6, 8)]
[(7, 1), (8, 2), (8, 3)]
[(7, 4), (8, 5), (8, 6)]

编辑: 如果您只想将列表与其后面的内容压缩在一起,正如评论中的人所解释的那样:

>>> import itertools
>>> for p in itertools.combinations(foo, 2):
...     print zip(*p)
... 
[(1, 4), (2, 5), (3, 6)]
[(1, 7), (2, 8), (3, 8)]
[(4, 7), (5, 8), (6, 8)]

这可能是一个非常好的解决方案,但它不能按照 OP 想要的方式工作 - 它将第二个列表与第一个列表进行了 zip(但它应该只与其后面的列表进行 zip)。 - Tadeck
我认为OP可能要求的是组合,而不是排列:“(但不包括第一个,因为已经使用了第一到第二个列表)” - Alex B
看起来主列表中有元组?这有什么不同吗?有没有办法使用此方法强制元组变成列表? - LiamNeesonFan
这只有在列表具有相同数量的元素时才有效吗? - Soren
不,它也适用于长度不相等的列表(顺便说一下,测试很简单)。 - stranac
显示剩余2条评论

2
a=[[1,2,3,4,5],[6,7,8,9,0],[2,5,7,9,4],[4,7,8,43,6]]

i=0

for l in a[i:]:
    for inner in a[i+1:]:
        print [list(b) for b in zip(l, inner)]
    i += 1

打印

[[1, 6], [2, 7], [3, 8], [4, 9], [5, 0]]
[[1, 2], [2, 5], [3, 7], [4, 9], [5, 4]]
[[1, 4], [2, 7], [3, 8], [4, 43], [5, 6]]
[[6, 2], [7, 5], [8, 7], [9, 9], [0, 4]]
[[6, 4], [7, 7], [8, 8], [9, 43], [0, 6]]
[[2, 4], [5, 7], [7, 8], [9, 43], [4, 6]]

通常情况下,你不应该在Python中使用C风格的循环。有时候是必要的,但这不符合Python的编程风格。 - Ceasar

2
def foo(li):
  for element in li[1:]:
    for pair in zip(li[0], element): 
      yield pair

>>> from test import foo
>>> bar = [[1, 2, 3, 5, 6], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
>>> foo(bar)
<generator object foo at 0x10592df50>
>>> [e for e in foo(bar)]
[(1, 6), (2, 7), (3, 8), (5, 9), (6, 10), (1, 11), (2, 12), (3, 13), (5, 14), (6, 15)]

2

只有在列表数目为偶数时,您才能实现预期的结果。以下代码将产生预期的结果。但是可能有更多“Pythonic”的方法。

foo = [[1,2,3,4,5],[6,7,8,9,0],[2,5,7,9,4],[4,7,8,43,6]]
newlist = []

for i in xrange(len(foo)):
    if i % 2 == 0:
        list1 = foo[i]
        list2 = foo[i + 1]
        for n in xrange(len(list1)):
            newlist.append([list1[n],list2[n]])

print newlist

结果:

[[1, 6], [2, 7], [3, 8], [4, 9], [5, 0], [2, 4], [5, 7], [7, 8], [9, 43], [4, 6]]

1
最短的解决方案是(lsts 是您拥有的列表的列表):
[zip(lsts[i],lsts[j]) for i in xrange(len(lsts)) for j in xrange(i,len(lsts)) if i!=j]

它将会完全按照你所说的去做。试一下吧。

这是你期望的吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接