请让我澄清:
获得两个数字之间所有唯一数字的最快方法是什么?例如,1万人和10万人。
一些明显的数字是12,345或23,456。我想找个办法把他们都聚集起来。
for i in xrange(LOW, HIGH):
str_i = str(i)
...?发布于 2013-09-11 03:53:33
使用itertools.permutations
from itertools import permutations
result = [
a * 10000 + b * 1000 + c * 100 + d * 10 + e
for a, b, c, d, e in permutations(range(10), 5)
if a != 0
]我利用了这样的事实:
10000和100000之间的数字有5或6位,但这里只有6位数字没有唯一的数字,itertools.permutations创建具有所有顺序的所有组合(因此12345和54321都将出现在结果中),具有给定的长度,编辑
谢谢你接受我的回答,但下面是其他人的数据,比较所提到的结果:
>>> from timeit import timeit
>>> stmt1 = '''
a = []
for i in xrange(10000, 100000):
s = str(i)
if len(set(s)) == len(s):
a.append(s)
'''
>>> stmt2 = '''
result = [
int(''.join(digits))
for digits in permutations('0123456789', 5)
if digits[0] != '0'
]
'''
>>> setup2 = 'from itertools import permutations'
>>> stmt3 = '''
result = [
x for x in xrange(10000, 100000)
if len(set(str(x))) == len(str(x))
]
'''
>>> stmt4 = '''
result = [
a * 10000 + b * 1000 + c * 100 + d * 10 + e
for a, b, c, d, e in permutations(range(10), 5)
if a != 0
]
'''
>>> setup4 = setup2
>>> timeit(stmt1, number=100)
7.955858945846558
>>> timeit(stmt2, setup2, number=100)
1.879319190979004
>>> timeit(stmt3, number=100)
8.599710941314697
>>> timeit(stmt4, setup4, number=100)
0.7493319511413574因此,总括而言:
7.96 s1.88 s,8.6 s0.75 s,最后一个解决方案看起来比其他人提出的解决方案快10倍左右。
注意:我的解决方案有一些我没有测量的进口产品。我以为您的导入会发生一次,并且代码将被多次执行。如果不是这样的话,请根据您的需要调整测试。
编辑2:我添加了另一种解决方案,因为在字符串上操作甚至不需要--它可以通过真正整数的排列来实现。我打赌这会更快。
发布于 2013-09-11 03:44:48
做这件事的廉价方法:
for i in xrange(LOW, HIGH):
s = str(i)
if len(set(s)) == len(s):
# number has unique digits这使用一个set来收集唯一的数字,然后检查总数字是否有相同的唯一数字。
发布于 2013-09-11 03:57:51
在这里,清单理解是可行的(从新生儿近地天体中窃取的逻辑):
[x for x in xrange(LOW,HIGH) if len(set(str(x)))==len(str(x))]对于那些好奇的人来说,这是一段时间:
> python -m timeit '[x for x in xrange(10000,100000) if len(set(str(x)))==len(str(x))]'
10 loops, best of 3: 101 msec per loophttps://stackoverflow.com/questions/18732297
复制相似问题