仅汇总列表中包含的数字

时间:2016-01-11 18:11:46

标签: python list python-2.7

提供一个方法,将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"])

6 个答案:

答案 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))

此外,正如评论中所述,不要使用dictlist等名称作为变量; *他们将影响他们的字典(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