【问题标题】:how to generate sequence of string in python between given start and end point如何在给定的起点和终点之间在python中生成字符串序列
【发布时间】:2021-08-19 10:25:21
【问题描述】:

我想输入作为开始输入,例如22EfFFFF 作为结束输入,我想打印这两个输入之间的所有字符串,输出应该是这样的

22Ef
22EA
22EB
.
.
.
FFFE
FFFF

这是我要选择的字符串

0123456789abcdefABCDEF

【问题讨论】:

  • 所以你想枚举一个以 22 为底的数字范围,以非标准方式编码?
  • 是的............

标签: python string sequence


【解决方案1】:

此解决方案避免遍历从 0000 到您的起始输入的所有组合:

start = '22Ef'
end = 'FFFF'
characterset = '0123456789abcdefABCDEF'

base = len(characterset)
baseNnumber = [] # little endian list of integers each representing a digit

# find base N representation of start
exponent = 0
startval = 0
for i in start[::-1]:
    digit = characterset.index(i)
    baseNnumber.append(digit)
    startval += digit * base**exponent
    exponent += 1

baseNnumber.extend([0]*(len(end)-len(start)))

# find representation of end
exponent = 0
endval = 0
for i in end[::-1]:
    digit = characterset.index(i)
    endval += digit * base**exponent
    exponent += 1

# number of times to print
increments = endval - startval + 1

for i in range(increments):
    index = 0
    outstr = ''

    # remove leading zeros
    notzero = False
    for i in baseNnumber[::-1]:
        notzero = notzero | (i != 0)
        # add new character to string
        outstr += characterset[i] * notzero

    # the actual printing
    print(outstr)

    # increment baseNnumber by 1
    while True:
        baseNnumber[index] += 1
        if baseNnumber[index] == base:
            baseNnumber[index] = 0
            index += 1
        else:
            break

如果您希望包含前导零,您可能希望将第 34-38 行替换为 notzero 旨在删除它们:

    for i in baseNnumber[::-1]:
        outstr += characterset[i]

或者,如果您确定开始和结束输入相同,只需删除第 17 行并在上面进行替换,因为它旨在解决开始和结束输入长度不同的问题。

【讨论】:

  • 非常感谢您的帮助
【解决方案2】:

以下(使用来自itertoolsproduct 函数)应该可以工作:

from itertools import product
strings = []
start = "22Ef"
end = "FFFF"
include = False
for i in product("0123456789abcdefABCDEF", repeat=4):
   curstring = "".join(i)
   if curstring == start:
       include = True
   if curstring == end:
        strings.append(curstring)
        break
   if include:
        strings.append(curstring)

print(strings)

【讨论】:

  • 有什么方法可以处理长距离,因为我输入了 64 个字符范围?谢谢
  • 你的意思是开始值和结束值都可以有64个字符?在那种情况下,我认为其他答案可能有效,但计算需要非常非常长的时间。
  • 例如,如果您想找出 64 个“2”的起始字符串和 64 个“3”的结束字符串之间的所有组合,则大约有 3.9e84 种不同的排列。跨度>
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多