Zip作为列表理解

时间:2012-11-01 15:59:58

标签: python list zip list-comprehension

我有最后一个这样的数据列表:

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,)]]

任何人都可以确定我在哪里出错吗?感谢。

3 个答案:

答案 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]))]