统计唯一数字一个班轮(有效)

时间:2012-05-25 10:06:27

标签: python

我正在寻找一种方法,可以通过一个班轮有效地计算唯一数字。

例如:给定整数623562,返回值为4

我现在这样做的方法是,给定i,使用len(set(str(i)))。 创建集合非常耗时。我要经历很多数字,所以我需要一种有效的方法。

此外,如果有人可以找到一种方法来查看所有带有x数字的数字而不使用 range()(在一个班轮里......),我会很高兴的。使用range时内存限制了我,因为创建了一个列表(我假设)。

3 个答案:

答案 0 :(得分:11)

set已针对此创建进行了优化。除非您想要推出自己的十进制到字符串转换(并且需要多行),否则就可以了。

range仅在Python 2.x中分配内存。对于像623562这样的小数字,内存应该不是问题。对于较大的数字,请在Python 2.x中使用xrange或者只需切换到Python 3.x,其中range及时生成数字。

答案 1 :(得分:2)

我很难相信len(set(str(num)))对你来说不够快。这是一个随机,非常大的100,000次len(set(str()))的测试:

% python -m timeit -s 'import random' 'for i in range(100000): \
  len(set(str(random.randint(199123212312399956789, 1000000099999999123091230000000))))'
10 loops, best of 3: 456 msec per loop

那段时间的大部分时间都只是产生随机数!如果你真的需要比这更快,我认为你应该考虑另一种语言。

答案 2 :(得分:1)

这是一种避免每次都创建一个集合的方法。除最后一行之外的所有行都是初始化代码,所以只发生一次:

>>> from operator import or_
>>> from collections import Counter
>>> from functools import reduce
>>> bits = {str(i):2**i for i in range(10)}
>>> counts = [Counter(format(i,'b'))['1'] for i in range(2**10)]

>>> counts[reduce(or_, (bits[c] for c in str(623562)))]
4

然而,它比简单,清晰,明显len(set(str(i)))慢约3倍。像往常一样,Python会让事情变得更加复杂或者过于聪明,会让你回想起并扼杀你的表现。

相关问题