我试图获取嵌套列表中的第一个元素并总结值。
例如。
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)
想知道我能编码的更好方法是什么?
答案 0 :(得分:3)
首先,Python 没有null
,相当于Java,C#,JavaScript等语言中的null
None
。< / p>
其次,我们可以在生成器表达式中使用过滤器。最通用的可能是用numbers
检查:
from numbers import Number
print sum(i[0] for i in nested_list if isinstance(i[0], Number))
Number
通常会确保我们接受int
,long
,float
,complex
等等。所以我们没有跟踪Python世界中我们自己数值的所有对象。
由于列表也可能包含空子列表,我们也可以检查:
from numbers import Number
print sum(i[0] for i in nested_list if i and isinstance(i[0], Number))
答案 1 :(得分:3)
只需过滤器然后,在这种情况下测试不是None
的值:
sum(i[0] for i in nested_list if i[0] is not None)
生成器表达式(以及list,dict和set comprehensions)可以使用任意数量的嵌套for
循环和if
语句。以上相当于:
for i in nested_list:
if i[0] is not None:
i[0] # used to sum()
注意这是如何反映您自己的代码;而不是使用if not ...: pass
和else
,我将测试反转为仅允许实际可以求和的值。如果您需要更多带过滤器的循环,或者使用for
或if
字符串,只需在嵌套顺序中从左到右添加更多and
循环或or
语句将if
过滤器中的多个测试结合在一起。
在您的具体情况下,只需测试if i[0]
就足够了;这会过滤掉None
和0
,但后者的值无论如何都不会对总和产生影响:
sum(i[0] for i in nested_list if i[0])
您已经在循环代码中进行了自己的if
测试。