【问题标题】:Get ALL items in a python list?获取python列表中的所有项目?
【发布时间】:2018-09-29 23:09:09
【问题描述】:

很容易获得列表中的项目数len(list),但假设我有一个矩阵,例如: [[1,2,3],[1,2,3]] 有没有返回6的pythonic方式?还是我必须迭代。

【问题讨论】:

  • 使用:l = [[1,2,3],[1,2,3]]sum(map(len, l)) 得到 6,但对你来说,一个项目是一个数字,但一个列表的项目只是一个项目,可以是另一个列表,数字,浮动,对象等
  • 您要查找的操作是“展平”列表。然后取扁平列表的长度
  • 可能迭代是 IMO 最易读的解决方案
  • 每当您对列表做任何花哨的事情时,答案都是总是“只使用 numpy”。

标签: python python-3.x list


【解决方案1】:

您可以使用chain

from itertools import chain
l = [[1,2,3],[1,2,3]]
len(list(chain(*l))) # give you 6

表达式list(chain(*l))给你平面列表:[1, 2, 3, 1, 2, 3]

【讨论】:

  • 如果矩阵也是 3 维的,例如[[[1,2,3]]]
【解决方案2】:
l = [[1,2,3],[1,2,3]]    
len([item for innerlist in l for item in innerlist])

给你 6

【讨论】:

    【解决方案3】:

    像这样制作矩阵 numpy 数组

    mat = np.array([[1,2,3],[1,2,3]])
    

    像这样使数组一维

    arr = mat.ravel()
    

    打印长度

    print(len(arr))
    

    【讨论】:

    • @eyllanesc 感谢您的编辑。我现在来自移动设备。我无法从这里格式化代码。
    【解决方案4】:

    您只需要展平列表。 Numpy 是最好的选择。 如果你愿意,你可以使用简单的if/else 来展平并返回列表的长度。 例如,

    list_1 = [1, 2, 3, 'ID45785', False, '', 2.85, [1, 2, 'ID85639', True, 1.8], (e for e in range(589, 591))]
    
    
    
    
    def to_flatten3(my_list, primitives=(bool, str, int, float)):
        flatten = []
        for item in my_list:
            if isinstance(item, primitives):
                flatten.append(item)
            else:
                flatten.extend(item)
        return len(flatten)
       
    print(to_flatten3(list_1))
    
    14
    
    [Program finished] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2019-11-02
      • 2013-12-07
      • 2015-10-25
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多