我可以进一步优化我的代码 - 减少循环

时间:2013-11-18 07:04:52

标签: python algorithm

我可以优化代码吗?数字可以是1到10 ** 9。

我想打印从第0页到第N页的书中每个数字从0到9的时间数。

在这种情况下,我可以使用map而不是第二个for循环吗?

表示范围(1,数字+ 1)中的i:         在str(i)中挖掘:             dic [dig] = dic [dig] +1

5 个答案:

答案 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]中的次数,那么对于这个问题有更有效的解决方案。蛮力迭代不是必要的。