我想在列表中列出一大堆列表:它看起来像这样:
[[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]]
然后我想再次使用第1和第3,直到结束。然后再从第二个列表开始到第3个,第4个......最后一行(但不是第一个,因为已经完成了第1到第2个列表)。如何编写能够执行此操作的代码?
这是我到目前为止所做的:
xcols =包含我上面显示的所有列表的列
def MakeLists(xcols):
multilist = []
for i in xcols:
for j in xcols[index(i):]:
currentlist = map(list.__add__, i, j)
multilist.append(currentlist)
当我运行它时,给我一个错误,可能是在地图部分,因为我不知道如何首先将每个元素转换为列表然后映射它们。任何帮助都会很棒。谢谢!
答案 0 :(得分:4)
这样的事情怎么样:
>>> 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)]
答案 1 :(得分: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]]
答案 2 :(得分:1)
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)]
答案 3 :(得分:1)
如果您拥有偶数列表,您将只能完成预期的结果。此代码将生成预期结果。然而,可能会有更多“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]]
答案 4 :(得分:1)
最短的解决方案是(lsts
是您拥有的列表的列表):
[zip(lsts[i],lsts[j]) for i in xrange(len(lsts)) for j in xrange(i,len(lsts)) if i!=j]
它会完全按照你说的做。试试这个。
这是你所期望的吗?