【问题标题】:Sum of first elements in nested lists嵌套列表中第一个元素的总和
【发布时间】:2018-05-30 17:19:45
【问题描述】:

我正在尝试获取嵌套列表中的第一个元素并对值求和。

例如。

nested_list = [[1, 'a'], [2, 'b'], [3, 'c'], [4, 'd']]
print sum(i[0] for i in nested_list)

但是,有时列表中的第一个元素 None 会改为

nested_list = [[1, 'a'], [None, 'b'], [3, 'c'], [4, 'd']]
new = []
for nest in nested_list:
    if not nest[0]:
        pass
    else:
        new.append(nest[0])
print sum(nest)

想知道如何更好地编写代码?

【问题讨论】:

    标签: python list numbers


    【解决方案1】:

    首先,Python 没有null,在Java、C#、JavaScript 等语言中,null 的等价物是None

    其次,我们可以在生成器表达式中使用过滤器。最通用的可能是检查numbers

    from numbers import Number
    
    print sum(i[0] for i in nested_list if isinstance(i[0], Number))

    Number 通常会确保我们接受ints、longs、floats、complexes 等。因此我们不必跟踪 Python 世界中的所有对象那是我们自己的数字。

    由于列表也可能包含 子列表,我们也可以检查:

    from numbers import Number
    
    print sum(i[0] for i in nested_list if i and isinstance(i[0], Number))

    【讨论】:

      【解决方案2】:

      然后过滤,在这种情况下测试不是None的值:

      sum(i[0] for i in nested_list if i[0] is not None)
      

      生成器表达式(以及列表、字典和集合推导)采用任意数量的嵌套 for 循环和 if 语句。以上等价于:

      for i in nested_list:
          if i[0] is not None:
              i[0]  # used to sum()
      

      注意这如何反映您自己的代码;而不是使用if not ...: passelse,我倒置了测试,只允许你实际可以求和的值。如果您需要更多带有过滤器的循环,只需在相同的从左到右添加更多for 循环或if 语句以嵌套顺序,或者使用andor 在单个@987654332 中将多个测试串在一起@过滤器。

      在您的具体情况下,只需测试 if i[0] 就足够了;这将过滤掉 None0,但后一个值不会对总和产生影响:

      sum(i[0] for i in nested_list if i[0])
      

      您已经在自己的循环代码中的if 测试中解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-06
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        相关资源
        最近更新 更多