問題は、コードのバージョンごとに異なります。これから始めましょう:
newli = re.sub(x, '', li)
l[li].replace(newli)
まず、newli
はすでに必要な行であり、そのため、ここでre.sub
はまったく必要ありませんreplace
。を割り当てるだけnewli
です。
第二に、 は行の値であり、 indexl[li]
ではないため、機能しません。li
このバージョンでは、より微妙ですが:
li = re.sub(x, '', li)
re.sub
は新しい文字列を返し、その文字列を に割り当てていますli
。しかし、それはリスト内の何にも影響しません。単に「li
リスト内の現在の行を参照するのではなく、この新しい文字列を参照するようになりました」と言っているだけです。
[]
リスト要素を置き換える唯一の方法は、演算子を使用できるようにインデックスを取得することです。そして、それを取得するには、 を使用しますenumerate
。
そう:
def remove_from_list(l, x):
for index, li in enumerate(l):
l[index] = re.sub(x, '', li)
return l
しかし、実際には、おそらく使用したいでしょうstr.replace
— それは、代わりにそれを使用したいだけですre.sub
:
def remove_from_list(l, x):
for index, li in enumerate(l):
l[index] = li.replace(x, '')
return l
x
が正規表現の特殊文字である場合に何が起こるかを心配する必要はありません。
また、Python では、オブジェクトをその場で変更したり、それを返したりすることはほとんどありません。変更して を返すNone
か、オブジェクトの新しいコピーを返します。したがって、次のいずれかです。
def remove_from_list(l, x):
for index, li in enumerate(l):
newli = li.replace(x, '')
l[index] = newli
… また:
def remove_from_list(l, x):
new_list = []
for li in l:
newli = li.replace(x, '')
new_list.append(newli)
return new_list
そして、unutbuの答えのように、後者をリスト内包表記にすることができます:
def remove_from_list(l, x):
new_list = [li.replace(x, '') for li in l]
return new_list
2 番目の方が簡単に記述できる ( が不要enumerate
、便利なショートカットがあるなど) のは偶然ではありません。通常は 2 番目の方が必要なため、Python を使用すると簡単に記述できます。
これをより明確にする方法は他にわかりませんが、最後にもう一度試してください。
リストをその場で変更するのではなく、修正されたリストの新しいコピーを返すバージョンを選択した場合、元のリストはまったく変更されません。修正された新しいコピーを使用する場合は、関数の戻り値を使用する必要があります。例えば:
>>> def remove_from_list(l, x):
... new_list = [li.replace(x, '') for li in l]
... return new_list
>>> a = [u'\n', u'1\xa0']
>>> b = remove_from_list(a, u'\xa0')
>>> a
[u'\n', u'1\xa0']
>>> b
[u'\n', u'1']
実際のコードですべてを 1 文字と 0 文字の文字列のリストに変換する際に発生している問題は、そもそも実際には文字列のリストがなく、リストの 1 つの文字列があることですrepr
。文字列の。つまり、 「 li l`ではなく、文字列内のfor li in l
各文字に対して」を意味します。li
l
for each string
in the list