【问题标题】:python reduce: find total size of all lists inside list of tuplespython reduce:查找元组列表中所有列表的总大小
【发布时间】:2016-12-21 05:18:30
【问题描述】:

我的数据结构如下所示

itemsData = [('data1', [1, 2, 3, 4]), ('data2', [1, 2]), ('data3', [1, 2, 3])]

我想在上面的元组列表中找到项目的总数。对于上面的例子,len([1,2,3,4] + len([1,2]) + len([1,2,3]) = 9

reduce(lambda x,y: len(x[1]) + len(y[1]), itemsData )

我得到的错误是

TypeError: 'int' object has no attribute '__getitem__'

【问题讨论】:

    标签: python lambda reduce


    【解决方案1】:

    我会解释为什么你的代码不起作用

    来自https://docs.python.org/2/library/functions.html#reduce

    左侧参数 x 是累积值,右侧参数 y 是来自可迭代对象的更新值

    所以在第一次迭代中,您的代码 len(x[1]) + len(y[1])x=('data1', [1, 2, 3, 4])y=('data2', [1, 2]) 开始工作,结果是6

    但是在第二次迭代中,你会得到x=6y=('data3', [1, 2, 3])]、 所以len(x[1]) 无效。

    使用reduce的正确代码是

    reduce(lambda x,y: x+len(y[1]), itemsData, 0)
    

    这工作自

    1st iteration ... x = 0, y = ('data1', [1, 2, 3, 4]), result = 4
    2nd iteration ... x = 4, y = ('data2', [1, 2]), result = 6
    3rd iteration ... x = 6, y = ('data3', [1, 2, 3]), result = 9
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      sum([len(elem[1]) for elem in itemsData])
      

      例如

      >>> itemsData = [('data1', [1, 2, 3, 4]), ('data2', [1, 2]), ('data3', [1, 2, 3])]
      >>> sum([len(elem[1]) for elem in itemsData])
      9
      

      【讨论】:

      • 不需要构造一个中间的长度列表。考虑“sum(len(x[1]) for x in xs)”。
      猜你喜欢
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      相关资源
      最近更新 更多