【问题标题】:Zip as a list comprehensionZip 作为列表理解
【发布时间】:2012-11-01 15:59:57
【问题描述】:

我有一个相当最后的数据列表,如下所示:

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

谁能指出我在哪里出错了?谢谢。

【问题讨论】:

  • 定义错误,所以我们知道发生了什么。
  • l = [(data[0]), (data[1]), (data[2])] 行实际上并没有做任何事情,你的例子已经做了你想要的。

标签: python list zip list-comprehension


【解决方案1】:

试试*

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

【讨论】:

    【解决方案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) 绝对是解决此问题的更好方法

    【讨论】:

      【解决方案3】:

      我会用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]))]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 2020-09-27
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多