0
return function.count('1') + given.count('2') + given.count('3')

有什么办法可以简化这条线?我也试过 return function.count('1', '2', '3') 但运行错误目标是计算字符串中包含的所有数字 lol

4

3 回答 3

3

假设function与 相同given

sum(function.count(x) for x in '1 2 3'.split())

变量名function(and given) 有点令人困惑,因为问题还说

目标是计算字符串中包含的所有数字

因此,如果function是一个字符串,并且您希望将计数扩展到您可以使用的所有数字

import string
sum(function.count(x) for x in string.digits)

如果function是一个短字符串就足够了。但请注意,每次调用都count需要完整地通过字符串function。如果function是一个非常大的字符串,执行 10 次可能效率低下。

在这种情况下,最好一次性丢弃不是数字的字符:

def onepass(x):
    return sum(1 for c in x if c in string.digits)

或者,您可以从字符串中删除所有非数字(使用translate 方法),然后使用len. 例如:

def drop_nondigits(x):
    # The essential idea comes from the translator recipe in Python Cookbook;
    # It can also be found here
    # http://code.activestate.com/recipes/303342-simple-wrapper-for-stringtranslate/
    keep = string.digits
    allchars = string.maketrans('', '')
    delete = allchars.translate(allchars, keep)
    return len(x.translate(allchars, delete))    

出于好奇,让我们将其与使用collections.Counter进行比较:

import collections
def using_counter(x):
    counter = collections.Counter(x)
    return sum(counter[d] for d in string.digits)

事实证明这drop_nondigits是最快的

In [26]: x = 'some very large string 123456' * 1000

In [38]: %timeit using_counter(x)
100 loops, best of 3: 7.26 ms per loop

In [29]: %timeit onepass(x)
100 loops, best of 3: 2.52 ms per loop

In [32]: %timeit drop_nondigits(x)
10000 loops, best of 3: 34.9 us per loop
于 2012-10-02T16:58:31.530 回答
2

用于Counter()计算字符串中包含的所有数字:

>>> from collections import Counter
>>> count= Counter("abcd12341134..09--01abc")
>>> [x for x in count.items() if x[0] in "0123456789"]
[('1', 4), ('0', 2), ('3', 2), ('2', 1), ('4', 2), ('9', 1)]

Counter()使用filter()

>>> strs="abcd12341134..09--01abc"
>>> Counter(filter(lambda x:x in "0123456789",strs))
Counter({'1': 4, '0': 2, '3': 2, '4': 2, '2': 1, '9': 1})
于 2012-10-02T17:02:16.517 回答
0

这会足够快吗?

count = Counter(strings) 
sum(v for k, v in count.items() if k in "0123456789")
于 2020-07-07T17:04:19.807 回答