在python中获取具有唯一数字的数字的最快方法是什么?

Set*_*hot 8 python performance

Lemme澄清:

什么是获得两个数字之间所有唯一数字的每个数字的最快方法.例如,10,000和100,000.

一些明显的将是12,345或23,456.我正试图找到一种方法来收集所有这些.

for i in xrange(LOW, HIGH):
  str_i = str(i)
  ...?
Run Code Online (Sandbox Code Playgroud)

Tad*_*eck 15

用途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
]
Run Code Online (Sandbox Code Playgroud)

我用了这样一个事实:

  • 之间的数字10000,并100000有5个或6位数字,但只有在这里6位数字,没有独特的数字,
  • itertools.permutations创建所有的组合,与所有排序(因此两者1234554321将出现在结果),具有给定长度,
  • 你可以直接在整数序列上进行排列(因此没有转换类型的开销),

编辑:

感谢您接受我的回答,但这是其他人的数据,比较上述结果:

>>> 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
Run Code Online (Sandbox Code Playgroud)

所以,总结一下:

最后的解决方案比其他人提出的解决方案快了大约10倍.

注意:我的解决方案有一些我没有测量的导入.我假设您的导入将发生一次,代码将被执行多次.如果不是这样,请根据您的需要调整测试.

编辑#2:我添加了另一个解决方案,因为甚至不需要对字符串进行操作 - 它可以通过实数整数的排列来实现.我敢打赌,这可以加快速度.


nne*_*neo 7

廉价的方法:

for i in xrange(LOW, HIGH):
    s = str(i)
    if len(set(s)) == len(s):
        # number has unique digits
Run Code Online (Sandbox Code Playgroud)

这使用a set来收集唯一数字,然后检查以查看总数中有多少个唯一数字.