当前位置:  开发笔记 > 编程语言 > 正文

仅汇总列表中包含的数字

如何解决《仅汇总列表中包含的数字》经验,为你挑选了3个好方法。

给出一个总和a中所有数字的方法list.该方法应该能够跳过不是数字的元素.所以,sum([1, 2, 3])应该6sum(['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))

另外,如评论中所述,不要使用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(第二个参数)并评估它是否是TrueFalse基于该函数.

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值,它会删除它们(以及该情况下的任何其他数字类型).如果您也需要,只需floatlambda函数中添加类型:

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.浮点是带小数的任何东西.



1> Jim Fasaraki..:

你可以用一个简单的衬里做到这一点:

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(第二个参数)并评估它是否是TrueFalse基于该函数.

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值,它会删除它们(以及该情况下的任何其他数字类型).如果您也需要,只需floatlambda函数中添加类型:

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`,你就不会在简洁或速度方面获得任何好处.
要包括每个数字类型而不提及每个数字类型,您可以使用相应的[ABC](https://docs.python.org/3/library/numbers.html),例如`isinstance(item,numbers.Number)`

2> PearsonArtPh..:

Pythonic方式是尝试/除外.虽然你可以在一个班轮中做到这一点,但我更喜欢把事情搞清楚,看看究竟发生了什么.

val=0
for item in list:
    try:
        val+=int(item)
    except ValueError:
        pass

如果要包含浮点数,只需将其更改int为a float.浮点是带小数的任何东西.


不知道你为什么被投票.如果这比"添加数字"更复杂,那么这就是***如何做到这一点.厚脸皮的单线并不是更好.
虽然我+ 1并且一般都同意(正如亚当所说,在更复杂的情况下),*在这种情况下*'try-catch`是过度的.此外,你在一个包木窗的``item`调用int`当它真的不应该是必要的,并且为了推广到包括所有的数字,你可能会做一个'如果isinstance`并删除`try`共.对于这些东西来说,"过滤器"是一个非常精彩的小功能,无法理解为什么你会这么做.
练习说添加所有_numbers_,而不是整数.那么为什么不将"val + = int(item)"更改为"val + = item"?在我看来,这可以解决已被提及的缺点 - 具有额外的优点,那就是在我看到这个之前正准备发布的解决方案,嘿.

3> Fabricator..:
sum([x for x in list if isinstance(x, (int, long, float))])


`过滤器'实际上只是"更好",当它在速度或简洁性上获得一些东西时(当你可以通过它在CPython上用C实现的内置函数时它只会提高你的速度).对于这样的事情,生成器表达式是最好的(与当前答案相同,但没有括号,使得`list`理解,这意味着没有创建和丢弃中间`list`s); 它没有更多或更不明确,可能稍微快一点.
推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有