【问题标题】:How to generate those substrings? [closed]如何生成这些子字符串? [关闭]
【发布时间】:2021-12-04 13:28:50
【问题描述】:

例如:

string0 = '288/24x6=18x13x8'

string1 = '8/24x6=18x13x8'
string2 = '8/24x6=18x13x8'
string3 = '8824x6=18x13x8'
string4 = '88/4x6=18x13x8'
...
stringX = '2/24x6=18x13x8'
stringX+1 = '2824x6=18x13x8'
...

不使用任何模块或库,例如itertools等...

基本上,删除2个字符,生成所有可能的子串。

【问题讨论】:

  • 那么,这个例子中的string1和string2有什么区别呢?
  • 在 string1 中,第一个字符 '2' 和第二个字符 '8' 被删除。在 string2 中,第一个字符“2”和第三个字符“8”被删除。

标签: python python-3.x string loops


【解决方案1】:

如果您出于某种奇怪的原因想要一个没有任何模块的解决方案并且您总是删除 2 个字符,您可以遍历可能要删除的位置的组合,然后使用字符串切片来删除这些位置。

如果您不想要重复的字符串(就像具有重复数字序列的字符串一样),您可以使用一个集合来只保留唯一的字符串:

orig = '288/24x6=18x13x8'
strings = set()
print(orig)

for outer_pos1 in range(len(orig)):
    for pos2 in range(len(orig)):
        # avoid overwriting outer loop variable for next inner iter.
        pos1 = outer_pos1
        if pos1 == pos2:
            continue
        if pos1 > pos2:
            pos1,pos2 = pos2,pos1
        new_string = orig[:pos1] + orig[pos1+1:pos2] + orig[pos2+1:]
        strings.add(new_string)

for new_string in strings:
    print(new_string)

但请注意,如果您的原始字符串很长并且您进行的移除不止 2 次,那么您的集合可能会非常大。

如果重复没问题,代码就更简单了:

orig = '288/24x6=18x13x8'
print(orig)

for outer_pos1 in range(len(orig)):
    for pos2 in range(len(orig)):
        # avoid overwriting outer loop variable for next inner iter.
        pos1 = outer_pos1
        if pos1 == pos2:
            continue
        if pos1 > pos2:
            pos1,pos2 = pos2,pos1
        new_string = orig[:pos1] + orig[pos1+1:pos2] + orig[pos2+1:]
        print(new_string)

pos1pos2 的交换是为了使顺序增加并且切片将正确运行。

【讨论】:

  • 实际上,我的 pos1pos2 的交换/排序似乎有问题,但我终生无法弄清楚原因
  • 由于某种原因,pos1 在交换后始终为 0,除非我更改外部循环变量的名称并在内部循环中分配 pos1 = outer,然后它可以工作:for weird in range(len(orig)): for pos2 in range(len(orig)): pos1 = weird
  • 哦,所有有效的方程式都比所有字符串都更难删除 2 个字符——尽管这可能应该在问题中明确说明。
  • (顺便说一句:我发现了我在第一条评论中提到的代码问题,我正在覆盖外部循环变量,当然它不会在下一次内部迭代中重新定义)。
  • 非常感谢 :)
【解决方案2】:

希望对你有所帮助,使用两个循环同时删除2个字符,

S = "288/24x6=18x13x8"

for i in range(len(S)):
  for j in range(len(S)-1):
     A=list(S)
     if i != j:
       A[i]="#"  
       A[j]="#"
       A="".join(A)
       print("Before:  " + A + "   After remove:  " + A.replace("#",""))

[输出]

Before:  ##8/24x6=18x13x8   After remove:  8/24x6=18x13x8
Before:  #8#/24x6=18x13x8   After remove:  8/24x6=18x13x8
Before:  #88#24x6=18x13x8   After remove:  8824x6=18x13x8
Before:  #88/#4x6=18x13x8   After remove:  88/4x6=18x13x8
Before:  #88/2#x6=18x13x8   After remove:  88/2x6=18x13x8
Before:  #88/24#6=18x13x8   After remove:  88/246=18x13x8
Before:  #88/24x#=18x13x8   After remove:  88/24x=18x13x8
Before:  #88/24x6#18x13x8   After remove:  88/24x618x13x8
Before:  #88/24x6=#8x13x8   After remove:  88/24x6=8x13x8
Before:  #88/24x6=1#x13x8   After remove:  88/24x6=1x13x8
Before:  #88/24x6=18#13x8   After remove:  88/24x6=1813x8
Before:  #88/24x6=18x#3x8   After remove:  88/24x6=18x3x8

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2013-04-30
    相关资源
    最近更新 更多