我可以优化代码吗?数字可以是1到10 ** 9。
我想打印从第0页到第N页的书中每个数字从0到9的时间数。
在这种情况下,我可以使用map
而不是第二个for循环吗?
表示范围(1,数字+ 1)中的i: 在str(i)中挖掘: dic [dig] = dic [dig] +1
答案 0 :(得分:4)
看起来您想为每个值添加一个。你可以使用词典理解:
dic = {k: v+1 for k, v in dic.items()} # Or dic.iteritems() in Python <2.7
经过一番澄清,看起来像是在寻找:
for page in book:
for n in range(1, 10):
dic[str(n)] += page.count(str(n))
答案 1 :(得分:1)
您可以使用collections.Counter
:
from collections import Counter
def solve(N):
return sum((Counter(str(i)) for i in xrange(1, N+1)), Counter())
print solve(10)
print solve(100)
<强>输出:强>
Counter({'1': 2, '0': 1, '3': 1, '2': 1, '5': 1, '4': 1, '7': 1, '6': 1, '9': 1, '8': 1})
Counter({'1': 21, '3': 20, '2': 20, '5': 20, '4': 20, '7': 20, '6': 20, '9': 20, '8': 20, '0': 11})
答案 2 :(得分:0)
您可以使用Counter这样的
number = 100
from collections import Counter
print Counter("".join([str(i) for i in range (1, number+1)]))
<强>输出:强>
Counter({'1': 21, '3': 20, '2': 20, '5': 20, '4': 20, '7': 20, '6': 20, '9': 20, '8': 20, '0': 11})
修改:正如评论中提到的hcwhsa,您的解决方案已经是最好的了。如果您的目标是减少行数,而不导入任何内容,则可以使用此
number = 100
numString = "".join([str(i) for i in range (1, number+1)])
print {str(i):numString.count(str(i)) for i in range(10)}
答案 3 :(得分:0)
我没有时间或测试这个,但我的老派方法将是这样的:
digits = "0123456789"
counts = [0] * (len(digits) + 1)
for c in text:
counts[digits.find(c)] += 1
适用于任何字符集,而不仅仅是数字,计数列表中的额外位置将计算不匹配的字符。 (.find()在找不到的char上返回-1,因此索引是现成的,可以选择最后一个列表条目。)
答案 4 :(得分:0)
如果你只想知道每个数字(0 - 9)出现在数字[1,N]中的次数,那么对于这个问题有更有效的解决方案。蛮力迭代不是必要的。