分析字符串,以更加具体的方式?

2024-09-30 16:41:15 发布

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

对于给定的输入字符串input = "abbbbdeeefffddddb",我想将其解析为

result = ['a', 'b', 'bb', 'bd', 'd', 'e', 'ee', 'f', 'ff', 'dd', 'db']

这种解析背后的逻辑如下。如果第一次遇到子字符串,它将被解析掉。在子串的每个后续出现中,它都与下面的字母合并,然后被解析掉。在

举例说明:

  1. 我们以前见过“a”(位置0)吗?不解析它。在
  2. 我们以前见过“b”(位置1)吗?不解析它。在
  3. 我们以前见过“b”(位置2)吗?是;与以下字母合并
  4. 我们以前见过“bb”(位置2和3)吗?不解析它。在
  5. (b)我们之前见过“4”位置?是与以下字母合并
  6. 我们以前见过“bd”(位置4和5)吗?不解析它。。。在

这一直持续到最后。在

我试图通过以下代码实现这一点:

input = "abbbbdeeefffddddb"

comparator = []

def parse(string):
    for pointer in range(len(string)-1):
        if string[pointer] not in comparator:
            comparator.append(string[pointer])

        else:
            substring = string[pointer] + string[pointer+1]
            comparator.append(substring)

        print comparator 

parse(input)

结果是:['a', 'b', 'bb', 'bb', 'bd', 'd', 'e', 'ee', 'ef', 'f', 'ff', 'fd', 'dd', 'dd', 'dd', 'db']

这是错误的。我这里缺少一个关键部分,但我不知道如何实现它,也许它需要一些递归函数,或者我应该在某处使用break或{}。在

不要只为给定的输入提供解决方案。这里给出的输入只是为了举例说明。解决方案必须是通用的,以适用于不同的输入。在

这是原始算法,第6页:paper


Tags: 字符串ininputdbstringparse字母bd
3条回答

你似乎忘记了跳过bigrams中的解析字母:

def parse(string):
    pointer = 0
    while pointer < len(string):
        if string[pointer] not in comparator:
            comparator.append(string[pointer])
        else:
            substring = string[pointer] + string[pointer+1]
            comparator.append(substring)
            pointer += 1
        pointer += 1
    print comparator
['a', 'b', 'bb', 'bd', 'e', 'ee', 'f', 'ff', 'd', 'dd', 'db']

或者稍微重写

^{pr2}$

使用set有什么问题?在

set(comparator)

如果订单不重要。在

这是你想要的吗?在

$ cat single-seen-double
#!/usr/bin/python3

def single_seen_double(string):
    length = len(string)
    index = 0
    seen = set()
    while index < length:
        if string[index] in seen and index < length - 1:
            yield string[index:index+2]
            index += 2
        else:
            seen.add(string[index])
            yield string[index]
            index += 1

def main():
    print(list(single_seen_double("abbbbdeeefffddddb")))

main()

zareason-dstromberg:~/src/outside-questions/single-seen-double x86_64-pc-linux-gnu 5871 - above cmd done 2013 Tue Nov 05 01:48 PM

$ ./single-seen-double
['a', 'b', 'bb', 'bd', 'e', 'ee', 'f', 'ff', 'd', 'dd', 'db']

它并没有给出您的示例输出,但我想知道这是否不是您真正想要的。如果这不是你需要的,你能更具体地说明你需要遵守什么规则吗?在

相关问题 更多 >