python - 有效地查找长整数中的数字序列

标签 python performance integer pattern-matching sequence

是否可以在不将其转换为字符串的情况下在整数中找到定义的序列? 也就是说,是否可以直接对整数进行某种形式的模式匹配。 我没有想到一个,但我一直认为应该有一种数学方法来做到这一点。这并不是说它更有效率。

(edit) 我实际上是什么数字不包含我正在寻找的数字序列。

整数会很大,至少有 289 位。要查找的序列可以是任何内容,“123”、“5”(有一个五)、“66666”

我对通用解决方案很感兴趣,但如果您想帮助解决我正在尝试解决的实际问题,请继续阅读。

更具体地说,我正在寻找长度为 4 的重复数字,即 1324322223313“2222”。 我盯着整数看,因为我将通过连续的整数递增,除非我得到一个具有 4 个长度重复的整数,然后我会跳到下一个没有重复的整数。我也不知道数字大于 4 的整数,即 12322135(它有一个 5)会被排除在外。

问题也可以表述为。 找出 z = range(x,y) 中的所有整数,使得 z[a] 不包含任何长度为 4 的重复数字和大于 4 的数字。range(x,y) 可能非常大

(编辑)回应评论,是的,我实际上想生成一个列表,我遇到的问题是我不确定如何制作满足我所有条件的生成器。也许我应该多考虑一下,我同意它会更简单,但它可能类似于素数生成器,没有这样的生成器。

最佳答案

你可以使用这个类来生成你的数字:-)

import math

class DecimalIndexing:
    def __init__(self, n):
        self.n = n
    def __len__(self):
        return int(math.floor(math.log10(self.n)+1))
    def __getitem__(self, i):
        if isinstance(i, slice):
            return [self[x] for x in range(i.start, i.stop, i.step or 1)]
        else:
            return (self.n/(10**i))%10
    def __iter__(self):
        for i in xrange(len(self)):
            yield self[i]

你可以这样使用它:

di = DecimalIndexing(31415927)
for i in xrange(len(di)):
    if di[i:i+4] == [9,5,1,4]:
        print "found"

或者像这样:

for i in xrange(len(di)):
    if di[i:i+3] == [di[i]]*3:
        print "group of three equal digits at," i

或者像这样:

if 5 in di:
    print "has a five"

或者像这样:

if any(x > 5 in di):
    print "some digit was greater than five"

等等

请记住,数字索引是“颠倒的”,即从右向左阅读。

关于python - 有效地查找长整数中的数字序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2042916/

相关文章:

python - 如何从 C API 返回包含 None 值的元组?

python - XHR 请求在 Scrapy 中失败,但在 python-requests 中有效

java - 如何分析hibernate JPA session 信息?

database - 整数压缩法

c++ - C++中长整数除法的上限

python - read_table pandas python 数字错误

python - Django - 使用 `admin/login.html` 模板作为普通登录模板时更改 site_header

c# - 在 C# 中返回对象列表的最快方法是什么?

performance - JMeter 是否最终以前端作为入口点测试 Web 应用程序的后端?

java - 从给定的整数中删除重复的数字