我有最后一个这样的数据列表:
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
我正在尝试压缩它,以便我得到这样的东西:
zipped_data = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
我知道我可以用
做到这一点l = [(data[0]), (data[1]), (data[2])]
zipped_data = zip(*l)
但是我想为data
中的任意数量的项目编写列表理解。我尝试了这个,但它没有用。
s = [zip(i) for i in data]
s
[[(1,), (2,), (3,)], [(4,), (5,), (6,)], [(7,), (8,), (9,)]]
任何人都可以确定我在哪里出错吗?感谢。
答案 0 :(得分:12)
试试*
:
In [2]: lis=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [3]: zip(*lis)
Out[3]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
答案 1 :(得分:2)
如果你真的想重写zip
作为列表理解,那么我就是这样做的:
In [25]: data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [26]: [tuple(lis[j] for lis in data) for j in range(min(len(l) for l in data))]
Out[26]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
In [27]: data = [[1, 2, 3], [4, 5, 6], [7, 8]]
In [28]: [tuple(lis[j] for lis in data) for j in range(min(len(l) for l in data))]
Out[28]: [(1, 4, 7), (2, 5, 8)]
尽管如此,zip(*data)
绝对是一个更好的方式来实现这个目标
答案 2 :(得分:0)
我会用zip
来做,但这里完成了列表理解
def zip_lists(lists):
"""
Assuming all lists have the same length
>>> zip_lists([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
>>> zip_lists([[1, 2], [3, 4], [5, 6], [7, 8]])
[[1, 3, 5, 7], [2, 4, 6, 8]]
"""
return [[l[x] for l in lists] for x in range(len(lists[0]))]