注意:该功能的目标是删除重复(重复)字符。
现在对于相同的递归函数,不同的输出会弹出不同的参数:
def rd(x):
if x[0]==x[-1]:
return x
elif x[0]==x[1]:
return rd(x[1: ])
else:
return x[0]+rd(x[1: ])
print("Enter a sentence")
r=raw_input()
print("simplified: "+rd(r))
仅当重复字符位于字符串的前六个字符内时,此函数才适用于参数,例如:
如果r=abcdeeeeeeefghijk
或r=abcdeffffffghijk
但如果重复字符在前六个字符之后,则输出与输入相同,即output = input。这意味着使用下面给出的值“r”,该函数不起作用:
if r=abcdefggggggggghijkde
(重复字符在前六个字符之后)
答案 0 :(得分:1)
你的功能不正常的原因是你先if x[0]==x[-1]
,你在那里检查当下子串的第一个和最后一个字符,但是留下许多可能性,如affffffa
或{ {1}}例如,让我们看看原因:
示例1:asdkkkkkk
这显然是对的吗?
示例2:'affffffa'
这里我们选择你的函数的情况3,然后再次
'asdkkkkkk'
当我们在'a' +rd('sdkkkkkk')
'a'+'s' +rd('dkkkkkk')
'a'+'s'+'d' +rd('kkkkkk')
时,它会停止,因为第一个和最后一个是相同的
示例3:'kkkkkk'
这里与示例2相同,在递归链中我们到达'asdfhhhhf'
,这里第一个和最后一个是相同的,所以它保持不变
如何修复它?,简单,就像其他已经显示的那样,首先检查字符串的长度
fhhhhf
这里是做同样的替代和迭代方法:你可以使用itertools recipes中的def rd(x):
if len(x)<2: #if my string is 1 or less character long leave it untouched
return x
elif x[0]==x[1]:
return rd(x[1: ])
else:
return x[0]+rd(x[1: ])
食谱
unique_justseen
测试
from itertools import groupby
from operator import itemgetter
def unique_justseen(iterable, key=None):
"List unique elements, preserving order. Remember only the element just seen."
# unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
# unique_justseen('ABBCcAD', str.lower) --> A B C A D
return map(next, map(itemgetter(1), groupby(iterable, key)))
def clean(text):
return "".join(unique_justseen(text)
如果你不想导入任何东西,这是另一种方式
>>> clean("abcdefggggggggghijk")
'abcdefghijk'
>>> clean("abcdefghijkkkkkkkk")
'abcdefghijk'
>>> clean("abcdeffffffghijk")
'abcdefghijk'
>>>
答案 1 :(得分:1)
我在代码中找到的唯一问题是第一个if
语句。我假设你用它来确保字符串至少有2个长。它可以使用字符串修饰符len()
来完成,实际上整个函数可以但我们会为OP提供递归。
def rd(x):
if len(x) < 2: #Modified to return if len < 2. accomplishes same as original code and more
return x
elif x[0]==x[1]:
return rd(x[1: ])
else:
return x[0]+rd(x[1: ])
r=raw_input("Enter a sentence: ")
print("simplified: "+rd(r))
但我建议不要使函数递归,而是改变原始字符串,如下所示
from collections import OrderedDict
def rd(string):
#assuming order does matter we will use OrderedDict, no longer recursive
return "".join(OrderedDict.fromkeys(string)) #creates an empty ordered dict eg. ({a:None}), duplicate keys are removed because it is a dict
#grabs a list of all the keys in dict, keeps order because list is orderable
#joins all items in list with '', becomes string
#returns string
r=raw_input("Enter a sentence: ")
print("simplified: "+rd(r))
答案 2 :(得分:0)
您的功能正确但是,如果您想查看最后一个字母,则该功能必须为:
def rd(x): if len(x)==1: return x elif x[0]==x[1]: return rd(x[1: ]) else: return x[0]+rd(x[1: ]) print("Enter a sentence") r=raw_input() print("simplified: "+rd(r))