3

文字列とその文字列内の文字を受け取り、その文字の出現回数が1回の新しい文字列を出力する関数を定義したいと思います。例えば

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

これは非常に基本的なことなので、理解するために徹底的に考え直す必要があります。次に、例を忘れて、自分自身を再現します。

もう1つの方法は、文字を列挙してインデックス番号を使用できるようにすることです。

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 に答える