return function.count('1') + given.count('2') + given.count('3')
有什么办法可以简化这条线?我也试过 return function.count('1', '2', '3') 但运行错误目标是计算字符串中包含的所有数字 lol
return function.count('1') + given.count('2') + given.count('3')
有什么办法可以简化这条线?我也试过 return function.count('1', '2', '3') 但运行错误目标是计算字符串中包含的所有数字 lol
假设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
用于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})
这会足够快吗?
count = Counter(strings)
sum(v for k, v in count.items() if k in "0123456789")