首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中获得具有唯一数字的数字的最快方法是什么?

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

Stack Overflow用户
提问于 2013-09-11 03:42:01
回答 5查看 2.4K关注 0票数 8

请让我澄清:

获得两个数字之间所有唯一数字的最快方法是什么?例如,1万人和10万人。

一些明显的数字是12,345或23,456。我想找个办法把他们都聚集起来。

代码语言:javascript
复制
for i in xrange(LOW, HIGH):
  str_i = str(i)
  ...?
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-11 03:53:33

使用itertools.permutations

代码语言:javascript
复制
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
]

我利用了这样的事实:

  • 10000100000之间的数字有5或6位,但这里只有6位数字没有唯一的数字,
  • itertools.permutations创建具有所有顺序的所有组合(因此1234554321都将出现在结果中),具有给定的长度,
  • 您可以直接对整数序列进行排列(因此不需要转换类型的开销),

编辑

谢谢你接受我的回答,但下面是其他人的数据,比较所提到的结果:

代码语言:javascript
复制
>>> 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

因此,总括而言:

  • solution no. 1带走了7.96 s
  • 解决方案2号(我最初的解决方案)采取了1.88 s
  • solution no. 3带走了8.6 s
  • 4号解决方案(我更新的解决方案)采用了0.75 s

最后一个解决方案看起来比其他人提出的解决方案快10倍左右。

注意:我的解决方案有一些我没有测量的进口产品。我以为您的导入会发生一次,并且代码将被多次执行。如果不是这样的话,请根据您的需要调整测试。

编辑2:我添加了另一种解决方案,因为在字符串上操作甚至不需要--它可以通过真正整数的排列来实现。我打赌这会更快。

票数 15
EN

Stack Overflow用户

发布于 2013-09-11 03:44:48

做这件事的廉价方法:

代码语言:javascript
复制
for i in xrange(LOW, HIGH):
    s = str(i)
    if len(set(s)) == len(s):
        # number has unique digits

这使用一个set来收集唯一的数字,然后检查总数字是否有相同的唯一数字。

票数 7
EN

Stack Overflow用户

发布于 2013-09-11 03:57:51

在这里,清单理解是可行的(从新生儿近地天体中窃取的逻辑):

代码语言:javascript
复制
[x for x in xrange(LOW,HIGH) if len(set(str(x)))==len(str(x))]

对于那些好奇的人来说,这是一段时间:

代码语言:javascript
复制
> 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 loop
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18732297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档