use*_*487 10 python list python-2.7
给出一个总和a中所有数字的方法list
.该方法应该能够跳过不是数字的元素.所以,sum([1, 2, 3])
应该6
但sum(['A', 1, 'B', 2, 3])
也应该如此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"])
Run Code Online (Sandbox Code Playgroud)
Jim*_*ard 17
你可以用一个简单的衬里做到这一点:
l1 = [1, 2, 3, 'A']
sum(filter(lambda i: isinstance(i, int), l1))
# prints 6
Run Code Online (Sandbox Code Playgroud)
或者,如果您在函数内需要它:
def foo(l1):
return sum(filter(lambda i: isinstance(i, int), l1))
Run Code Online (Sandbox Code Playgroud)
另外,如评论中所述,不要使用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)
Run Code Online (Sandbox Code Playgroud)
然后获取列表中的每个元素l1
(第二个参数)并评估它是否是True
或False
基于该函数.
b)然后,filter
将基本上过滤掉列表l1
中不是实例的任何对象int
(即函数False
为它们返回).因此,对于像[1, 2, 3, 'A']
过滤器这样的列表将返回[1, 2, 3]
,然后将其汇总sum()
.
一些例子:
foo([1, 2, 3, 'A'])
# 6
foo([1, 2, 3])
# 6
foo([1, 2, 3, 'HELLO', 'WORLD'])
# 6
Run Code Online (Sandbox Code Playgroud)
稍微警告:
原样,这不会总结float
值,它会删除它们(以及该情况下的任何其他数字类型).如果您也需要,只需float
在lambda
函数中添加类型:
lambda i: isinstance(i, (int, float))
Run Code Online (Sandbox Code Playgroud)
现在,你的函数总和浮点数:
foo([1, 2, 3, 3.1, 'HELLO', 'WORLD'])
# 9.1
Run Code Online (Sandbox Code Playgroud)
在lambda
函数中根据需要添加任何其他类型以捕获所需的案例.
抓住所有案例:
如@Copperfield所述,您可以通过利用模块中的numbers.Number
抽象基类来检查任何数字实例的对象numbers
.这充当了数值的全部情况:
import numbers # must import
sum(filter(lambda i: isinstance(i, numbers.Number), l1))
Run Code Online (Sandbox Code Playgroud)
更简单也更快一点:
另外,正如@ShadowRanger所指出的,并且因为lambda
对于新用户来说可能不是最舒适的构造,所以可以简单地使用生成器表达式(也更快)sum
来获得相同的精确结果:
sum(val for val in l1 if isinstance(val, numbers.Number))
Run Code Online (Sandbox Code Playgroud)
Pea*_*oto 10
Pythonic方式是尝试/除外.虽然你可以在一个班轮中做到这一点,但我更喜欢把事情搞清楚,看看究竟发生了什么.
val=0
for item in list:
try:
val+=int(item)
except ValueError:
pass
Run Code Online (Sandbox Code Playgroud)
如果要包含浮点数,只需将其更改int
为a float
.浮点是带小数的任何东西.
sum([x for x in list if isinstance(x, (int, long, float))])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3392 次 |
最近记录: |