0

私がリストを持っているとしましょう

x = [ 'apple', 'orange', 'grape','strawberry'] 

リストxの単語から文字「e」を削除するか、次のような新しいリストを返したい

['appl', 'orang', 'banana', 'grap', 'strawbrry']

私はこれを試しました:

for i in x:
    for z in i:
        if z == 'e':
            i.remove(z)

そして、私が期待したエラーが発生しました: AttributeError: 'str' object has no attribute 'remove' だから、2 番目のループの前に list(i) を試しましたが、思い通りに動作しませんでした。

4

3 に答える 3

5

このタスクに 2 つの for ループを使用するのは非効率的です。代わりに、リスト内包表記とを使用する必要がありstr.replaceます。

>>> x = ['apple', 'orange', 'grape', 'strawberry']
>>> [y.replace('e', '') for y in x]
['appl', 'orang', 'grap', 'strawbrry']
>>>

このメソッドは、リスト内のアイテムを適切かつ効率的にフィルタリングします。

于 2013-11-09T17:57:57.727 に答える
4

これを行う最も効率的な方法は、translate

x = [ 'apple', 'orange', 'grape','strawberry']
print [fruit.translate(None, 'e') for fruit in x]

出力

['appl', 'orang', 'grap', 'strawbrry']
于 2013-11-09T18:06:28.670 に答える
0

前の回答はどちらも問題を解決しますが、メソッドが機能しない理由を明確にしたいだけです。基本的に、Python に文字列をテーブルとして扱うように指示していますが、これはある程度しかできません。デフォルトでは、Python は文字列をコンポーネントで構成されているとは見なしません。そのため、Python が文字列をどのように見るか (つまり、スライスまたは list()) を変更するまで、文字列の一部を削除することはできません。イテレータを使用するように設定されている場合は、このようなコードを作成して、実際に文字列をリストに変換し、再びリストに戻すことができます。

for i in x:
a = len(i)
for z in i:
    if z == 'e':
        b = 0
        i = list(i)
        i.remove(z)
        word = str()
        while b <= a:
            word = word + i[b]
            i = word
            b = b + 1

私はこれをテストしていませんが、コード的には機能します。ご覧のとおり、これは非常に単純なタスクを実行するための大量のコードであり、str.replace は同じことを手間をかけずに達成するための素晴らしく簡単な方法であるという iCodez の意見に完全に同意します。そもそも何が間違っていたのかを明確にしたかっただけです。お役に立てれば!

于 2013-11-09T18:54:23.250 に答える