给出一个总和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"])
Jim Fasaraki.. 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
(即函数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
稍微警告:
原样,这不会总结float
值,它会删除它们(以及该情况下的任何其他数字类型).如果您也需要,只需float
在lambda
函数中添加类型:
lambda i: isinstance(i, (int, float))
现在,你的函数总和浮点数:
foo([1, 2, 3, 3.1, 'HELLO', 'WORLD']) # 9.1
在lambda
函数中根据需要添加任何其他类型以捕获所需的案例.
抓住所有案例:
如@Copperfield所述,您可以通过利用模块中的numbers.Number
抽象基类来检查任何数字实例的对象numbers
.这充当了数值的全部情况:
import numbers # must import sum(filter(lambda i: isinstance(i, numbers.Number), l1))
更简单也更快一点:
另外,正如@ShadowRanger所指出的,并且因为lambda
对于新用户来说可能不是最舒适的构造,所以可以简单地使用生成器表达式(也更快)sum
来获得相同的精确结果:
sum(val for val in l1 if isinstance(val, numbers.Number))
如果你需要`lambda`来使用`map` /`filter`,你也可以使用生成器表达式(或list comp); 一旦你求助于`lambda`s with`map` /`filter`,你就不会在简洁或速度方面获得任何好处. (3认同)
要包括每个数字类型而不提及每个数字类型,您可以使用相应的[ABC](https://docs.python.org/3/library/numbers.html),例如`isinstance(item,numbers.Number)` (2认同)
PearsonArtPh.. 10
Pythonic方式是尝试/除外.虽然你可以在一个班轮中做到这一点,但我更喜欢把事情搞清楚,看看究竟发生了什么.
val=0 for item in list: try: val+=int(item) except ValueError: pass
如果要包含浮点数,只需将其更改int
为a float
.浮点是带小数的任何东西.
你可以用一个简单的衬里做到这一点:
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
(即函数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
稍微警告:
原样,这不会总结float
值,它会删除它们(以及该情况下的任何其他数字类型).如果您也需要,只需float
在lambda
函数中添加类型:
lambda i: isinstance(i, (int, float))
现在,你的函数总和浮点数:
foo([1, 2, 3, 3.1, 'HELLO', 'WORLD']) # 9.1
在lambda
函数中根据需要添加任何其他类型以捕获所需的案例.
抓住所有案例:
如@Copperfield所述,您可以通过利用模块中的numbers.Number
抽象基类来检查任何数字实例的对象numbers
.这充当了数值的全部情况:
import numbers # must import sum(filter(lambda i: isinstance(i, numbers.Number), l1))
更简单也更快一点:
另外,正如@ShadowRanger所指出的,并且因为lambda
对于新用户来说可能不是最舒适的构造,所以可以简单地使用生成器表达式(也更快)sum
来获得相同的精确结果:
sum(val for val in l1 if isinstance(val, numbers.Number))
Pythonic方式是尝试/除外.虽然你可以在一个班轮中做到这一点,但我更喜欢把事情搞清楚,看看究竟发生了什么.
val=0 for item in list: try: val+=int(item) except ValueError: pass
如果要包含浮点数,只需将其更改int
为a float
.浮点是带小数的任何东西.
sum([x for x in list if isinstance(x, (int, long, float))])