【问题标题】:Flatten a list in python在python中展平列表
【发布时间】:2012-04-25 00:00:21
【问题描述】:

我有一个这样的列表:

[[(video1,4)], [(video2,5),(video3,8)], [(video1,5)], [(video5, 7), (video6,9)]...]

这个列表中的每一项可能包含一个数据对,或者一个元组,我想把这个列表改成

[(video1,4),(video2,5),(video3,8),(video1,5),(video5,7),(video6,9)...]

然后这样做:

for item in list:
    reqs = reqs + item[1]
    b.append(item[0])
c = set(b)

不知道如何改变列表结构,或者如何在原始列表的基础上做同样的计算?

【问题讨论】:

  • 您需要示例列表中的... 吗?没有它,这将是一个工作示例。
  • 你到底想达到什么目的?一组cvideoX 变量和您列出的其他数字的总和?
  • @jamylak no, .... 表示还有很多类似的数据,我不会一一列举
  • @Shep 是的,这个列表包含很多数据,不仅仅是我在这里列出的数据,但基本上这就是我想要做的

标签: python


【解决方案1】:

如果你只是想展平列表,只需使用itertools.chain.from_iterablehttp://docs.python.org/library/itertools.html#itertools.chain.from_iterable

【讨论】:

    【解决方案2】:

    要展平一层,可以使用itertools.chain.from_iterable()

    flattened_list = itertools.chain.from_iterable(my_list)
    

    【讨论】:

    • @Marcin:你说得对,这就是 NumPy 中的调用方式。 :)
    • 证明,好像需要证明,数字对你不利;)
    【解决方案3】:

    列表推导有一种非常简单的方法。这个例子已经记录在python文档here

    >>> # flatten a list using a listcomp with two 'for'
    >>> vec = [[1,2,3], [4,5,6], [7,8,9]]
    >>> [num for elem in vec for num in elem]
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    这是您想要实施的解决方案。根据您的示例,这是最简单的解决方案

    In [59]: your_list = [[('video1',4)], [('video2',5),('video3',8)], [('video1',5)], [('video5', 7), ('video6',9)]]
    
    In [60]: improved_list = [num for elem in your_list for num in elem]
    
    In [61]: improved_list
    Out[61]: 
    [('video1', 4),
     ('video2', 5),
     ('video3', 8),
     ('video1', 5),
     ('video5', 7),
     ('video6', 9)]
    

    【讨论】:

      【解决方案4】:

      如果这个列表是singly-nested(列表列表),你可以这样做,我经常使用

      flat_list = sum(list_of_lists, [])
      

      之所以有效,是因为 sum 只是简单地将列表相加,而在 python 中相加列表可以按预期工作:)

      注意:这是低效的,有人说不可读。

      【讨论】:

        【解决方案5】:

        这是另一个(没有库):

        def plus(a,b): return a + b
        reduce(plus, your_list)
        

        【讨论】:

        • 为什么要创建命名函数而不是 lambda?
        • 只是为了清楚起见,没有特殊原因。
        【解决方案6】:

        试试这个:

        from itertools import chain 
        
        c = set()
        reqs = 0
        for vid, number in chain(*your_list): 
            c.add(vid)
            reqs += number 
        

        另见相关帖子Flattening a shallow list in Python

        使用chain.from_iterable(list) 而不是chain(*list) 的性能提升应该可以忽略不计,但确实前者看起来更干净。

        【讨论】:

          【解决方案7】:

          从数据结构中提取所有元组...

          def get_tups(y):
              z = []
              if y:
                  for x in y:
                      if isinstance(x, tuple):
                          z.append(x)
                      else:
                          z.extend(get_tups(x))
              return z
          

          也许……

          【讨论】:

          • 如果我打电话给get_tups([('foo',)])会发生什么?
          • 由于输入包含 1 个元组,您将得到一个包含 1 个元组的列表。换句话说,输出将与输入相同;)
          • 如果我再次调用它会发生什么?这里有一个提示:ideone.com/zgMzq
          • 啊。为什么第二次调用 z 不是空列表?
          • 因为您在代码中附加了一个值,并且表达式 z=[] 被评估为 def 语句的一部分。
          猜你喜欢
          • 2016-10-22
          • 2021-09-07
          • 2022-11-28
          • 1970-01-01
          • 2018-07-19
          • 2019-11-04
          • 2017-05-22
          • 1970-01-01
          相关资源
          最近更新 更多