对于给定的输入字符串input = "abbbbdeeefffddddb"
,我想将其解析为
result = ['a', 'b', 'bb', 'bd', 'd', 'e', 'ee', 'f', 'ff', 'dd', 'db']
此解析背后的逻辑如下。如果第一次遇到子字符串,则会将其解析掉。在每个后续出现的子字符串中,它都会用以下字母连接起来然后解析掉。
举例说明:
这一直持续到最后。
我尝试使用以下代码实现此目的:
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
或continue
。
不要仅为此给定输入提供解决方案。这里给出的输入仅仅是为了举例。解决方案也必须适用于不同的输入。
以下是原始算法,第6页:paper
答案 0 :(得分:2)
你似乎忘记了从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']
或略有改写
def parse(string):
result = set()
letters = iter(string)
for letter in letters:
if letter not in result:
result.add(letter)
else:
substring = letter + letters.next()
result.add(substring)
return list(result)
# same set, different order
['a', 'bd', 'b', 'e', 'd', 'bb', 'f', 'ee', 'dd', 'db', 'ff']
答案 1 :(得分:2)
这是关于你想要的吗?
$ 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']
它并没有提供你的样本输出,但我想知道这是不是你真正想要的。如果它不是您所需要的,您是否可以更具体地了解您需要遵循的规则?
答案 2 :(得分:0)
使用set?
有什么问题 set(comparator)
如果订单不重要。