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 次 |
| 最近记录: |