web-dev-qa-db-ja.com

リストのNone値を置き換えますか?

私が持っています:

d = [1,'q','3', None, 'temp']

None値を「None」または任意の文字列に置き換えたい

期待される効果:

d = [1,'q','3', 'None', 'temp']

文字列とforループで置き換えてみてくださいが、エラーが発生します:

TypeError: expected a character buffer object
23
user7172

単純なリスト内包表記を使用します。

['None' if v is None else v for v in d]

デモ:

>>> d = [1,'q','3', None, 'temp']
>>> ['None' if v is None else v for v in d]
[1, 'q', '3', 'None', 'temp']

is Noneは、Noneシングルトンに一致するかどうかをテストします。

54
Martijn Pieters

単にmapを使用し、str関数を使用してすべてのアイテムを文字列に変換できます。

map(str, d)
#['1', 'q', '3', 'None', 'temp']

None値のみを変換する場合は、次のことができます。

[str(di) if di is None else di for di in d]
8

長くて非効率的だが初心者に優しい forループを使用すると、次のようになります。

d = [1,'q','3', None, 'temp']
e = []

for i in d:
    if i is None: #if i == None is also valid but slower and not recommended by PEP8
        e.append("None")
    else:
        e.append(i)

d = e
print d
#[1, 'q', '3', 'None', 'temp']

初心者のみ、@ Martinsの回答はパワーと効率の点でより適しています

2
K DawG

リストの内包表記は正しい方法ですが、場合によっては、最もよく知られている理由で、新しいリストを作成するのではなく、その場で置き換えてください(python list可変)、代替アプローチは次のとおりです

d = [1,'q','3', None, 'temp', None]
try:
    while True:
        d[d.index(None)] = 'None'
except ValueError:
    pass

>>> d
[1, 'q', '3', 'None', 'temp', 'None']
1
Abhijit

Python 3.6から始めると、短い形式で実行できます。

d = [f'{e}' for e in d]

これが誰かに役立つことを願っています、それは私がほんの少し前にこの問題を抱えていたからです。

1
Uzzy