2

解析するサンプル データ (Unicode 文字列のリスト):

[u'\n', u'1\xa0', u'Some text here.', u'\n', u'1\xa0', u'Some more text here.', 
u'\n', u'1\xa0', u'Some more text here.']

\xa0これらの文字列から削除したい。

編集: 現在のメソッドが機能しない:

def remove_from_list(l, x):
  return [li.replace(x, '') for li in l]

remove_from_list(list, u'\xa0')

私はまだまったく同じ出力を得ています。

4

3 に答える 3

5

問題は、コードのバージョンごとに異なります。これから始めましょう:

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各文字に対して」を意味します。lilfor each stringin the list

于 2013-05-17T19:20:59.937 に答える
3

ASCII文字のみに関心がある場合の別のオプション(あなたが言及charactersしたように、これは投稿された例の場合にも機能します):

[text.encode('ascii', 'ignore') for text in your_list]
于 2013-05-17T19:22:55.763 に答える