提供一个方法,将list
中的所有数字相加。该方法应该能够跳过不是数字的元素。因此,sum([1, 2, 3])
应为6
,但sum(['A', 1, 'B', 2, 3])
也应为<{em} 6
。我怎么能做到这一点?
到目前为止我已尝试过:
def foo(list):
dict = "ABCDEFGHIJKLMN"
n = 0
for i in range(0, len(list) - 1):
if list[i].str in dict:
""
else:
n= n + list[i]
return n
print foo([1, 2, 3, 4, 5, 6, "A", "B"])
答案 0 :(得分:17)
你可以用一个简单的衬垫来做到这一点:
l1 = [1, 2, 3, 'A']
sum(filter(lambda i: isinstance(i, int), l1))
# prints 6
或者,如果你需要一个函数:
def foo(l1):
return sum(filter(lambda i: isinstance(i, int), l1))
此外,正如评论中所述,不要使用dict
和list
等名称作为变量; *他们将影响他们的字典(dict
)和(list
)类型的内置名称。然后,您需要明确del dict, list
才能按预期使用它们。
但是,让我解释一下。 filter
的作用是:
a)它将一个函数作为其第一个参数:
# this function will return True if i is an int
# and false otherwise
lambda i: isinstance(i, int)
然后获取列表l1
(第二个参数)中的每个元素,并根据函数评估它是True
还是False
。
b)然后,filter
将基本上过滤掉列表l1
内不是int
实例的任何对象(即函数返回{{1}对他们来说)。因此,对于类似False
过滤器的列表,将返回[1, 2, 3, 'A']
,然后将其归结为 sum()
。
一些例子:
[1, 2, 3]
稍加警告:
按原样,这并不总结foo([1, 2, 3, 'A'])
# 6
foo([1, 2, 3])
# 6
foo([1, 2, 3, 'HELLO', 'WORLD'])
# 6
值,它会丢弃它们(以及该情况下的任何其他数字类型)。如果您也需要,只需在float
函数中添加float
类型,如下所示:
lambda
现在,你的函数总和浮点数:
lambda i: isinstance(i, (int, float))
在foo([1, 2, 3, 3.1, 'HELLO', 'WORLD'])
# 9.1
函数中根据需要添加任何其他类型以捕获您需要的案例。
抓住所有案例:
如 @Copperfield 所述,您可以使用 {中的 numbers.Number
抽象基类来检查任何数字实例的对象{3}} 模块。这可以作为数值的全部案例:
lambda
更简单,也更快一点:
此外,正如 @ShadowRanger 以及numbers
所述,人们可以使用 lambda
might not be the most comfortable construct for new users (也更快){ {1}}获得相同的结果:
import numbers # must import
sum(filter(lambda i: isinstance(i, numbers.Number), l1))
答案 1 :(得分:10)
Pythonic方式是尝试/除外。虽然你可以在一个班轮中做到这一点,但我更喜欢把事情搞清楚,看看究竟发生了什么。
val=0
for item in list:
try:
val+=int(item)
except ValueError:
pass
如果您想要包含浮点数,只需将int
更改为float
即可。浮点是带小数的任何东西。
答案 2 :(得分:8)
sum([x for x in list if isinstance(x, (int, long, float))])
答案 3 :(得分:4)
使用过滤器,就像这样
>>> test = [1,2,3,4,5,6,"A","B"]
>>> sum(filter(lambda x:isinstance(x,int),test))
21
>>>
答案 4 :(得分:3)
def foo(list):
dict= "ABCDEFGHIJKLMN"
n=0
for i in range(0,len(list)-1):
if str(list[i]) in dict:
""
else:
n= n+list[i]
return n
print foo([1,2,3,4,5,6,"A","B"])
答案 5 :(得分:1)
def filtersum(L):
if not L: return 0
if not isinstance(L[0], int): return filtersum(L[1:])
return L[0] + filtersum(L[1:])
输出:
In [28]: filtersum([1,2,3])
Out[28]: 6
In [29]: filtersum([1,'A', 2,3])
Out[29]: 6