将电话号码范围列表转换为前缀lis

2024-04-19 07:32:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个电话号码范围,例如:

3331234-3332345

我需要编写一个函数,将其转换为前缀列表:

3331234
...
3331239
333124
...
333129
33313
...
33319
33320
...
33322
333231
333232
333233
3332341
...
3332345

这个问题并不容易。我不需要得到范围开始和结束之间的数字列表。在


Tags: 函数列表电话号码数字
3条回答

我的工作代码。也不是很快。欢迎优化。在

def diap_to_prefix(a, b):
    lst = ['%0*d'%(max(len(str(a)), len(str(b))), x) for x in range(int(a), int(b)+1)]
    new_lst = []

    while len(lst) != len(new_lst):
        lst = new_lst or lst
        new_lst = []

        c = lst[0]
        tmp_lst = [c]

        for i in lst[1:]:
            if c[:-1] == i[:-1]:
                c = i
                tmp_lst.append(c)
            else:
                if len(tmp_lst) == 10:
                    new_lst.append(c[:-1])
                else:
                    new_lst.extend(tmp_lst)

                c = i
                tmp_lst = [c]

        if len(tmp_lst) == 10:
            new_lst.append(c[:-1])
        else:
            new_lst.extend(tmp_lst)

    return lst

我的新的更优化的解决方案(py3.4)

def diap_to_prefix(a, b):
    def inner(aa, bb, p):
        if p == 1:
            if a <= aa <= b:
                yield aa
            return

        for d in range(aa, bb + 1, p):
            if a <= d and d + p - 1 <= b:
                yield d // p
            elif not (bb < a or aa > b):
                for i in range(10):
                    yield from inner(d + i * p // 10, d + (i + 1) * p // 10 - 1, p // 10)

    a, b = int(a), int(b)
    p = 10**(max(len(str(x)) for x in (a, b)) - 1)
    yield from inner(a // p * p, b // p * p + p - 1, p)

您需要获取以“-”分隔的值的公共前缀,因此:

  • 使用.split来获取这些内容,并对其进行迭代,直到找到不同之处
  • 用0来完成第一个值(以获得最少的数字),直到得到phone_len位,并对最大值执行相同的操作(使用9)
  • 然后,你有一个简单的数字范围
  • 遍历它们并将其转换为字符串

这里是:

phone_len = 7
R = "33312345-3332345".split("-")

prefix = ""
for i in range(len(R[0])):
    if R[0][i] == R[1][i]:
        prefix += R[0][i]
    else:
        break

m = int(R[0]+"0"*(phone_len-len(R[0])))
M = int(R[1]+"9"*(phone_len-len(R[0])))

phones = [str(n) for n in range(m, M+1)]

相关问题 更多 >