3

我想定义一个函数,该函数接受一个字符串和该字符串中的一个字母,并输出一个新字符串,该字母出现一次。例如

my_function("happy kitten","p")
'hapy kitten' 

或者

my_function("happykitten","t") 
'happykiten'

我试过了

def my_function(string, lett):
newString = ""
for char in string: #all characters
    for s in string: #character I'm testing
        if s == len(s) > 1: 
            newString+=lett # if there are multiple occurrences of s, replace with lett since its a single char anyway
        else:
            newString+=char #if not a duplicate, add next char to newString
    return newString #("happy kitten","p") returns 'ppppppppppp'

def my_function(string, lett):
newString = ""
for char in string: #all characters
    for s in string: #character I'm testing
        if s == s+1: 
            newString+=lett # if there are multiple occurrences of s, replace with lett since its a single char anyway
        else:
            newString+=char #if not a duplicate, add next char to newString
    return newString #TypeError: cannot concatenate 'str' and 'int' objects

我的功能出了什么问题?请不要导入或内置函数。

4

2 回答 2

4

好吧,如果您对导入/内置函数改变主意,您可以随时这样做:

from itertools import groupby

def my_function(s, c):
    return ''.join(c if a==c else ''.join(b) for a,b in groupby(s))

>>> from itertools import groupby
>>> def my_function(s, c):
...     return ''.join(c if a==c else ''.join(b) for a,b in groupby(s))
... 
>>> my_function("happy kitten","p")
'hapy kitten'
>>> my_function("happykitten","t")
'happykiten'
于 2013-03-22T13:08:11.027 回答
2

对字符进行迭代是低效的,而且很可能是错误的做法。听起来真的很像新生课程的家庭作业。在现实生活中,您应该研究正则表达式,这个问题似乎提供了一个优雅的答案。

您的问题是您假设 s+1 指向迭代器中的下一个值,这不是一个有效的假设。您需要做的是记录目击并在下一次迭代中采取相应的行动。

我们仍然可以在实践中解决这个问题:

def strip_duplicate_letters(input, letter):
  output = ''
  last = False

  for c in input:
    if c == letter:
      if last:
        continue
      else:
        last = True
    else:
      last = False
    output += c

  return output

这是一件非常基本的事情,您必须彻底考虑以确保您理解。然后忘记示例并复制自己。

另一种方法是枚举字母以使索引号可用:

for i, c in enumerate(input):
  if i > 0 and c == letter and input[i-1] == letter:
    continue
  output += c

如果enumerate问题太大,您可以使用整数作为计数器并增加它。

i = 0
for c in input:
  ....
  i += 1
  ...
于 2013-03-22T12:56:49.347 回答