2013-10-14 9 views
15

私が持っている:リストにNone値を置き換えますか?

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

文字列にし、forループを置き換えてみたが、私は得る:

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

は、私が「なし」または任意の文字列

期待される効果になし値を置き換えたいですエラー:

TypeError: expected a character buffer object 
+2

次の処理(文字バッファオブジェクトが必要です)のために 'None'を文字列に変換する必要がある場合は、' 1'も文字列に変換する必要はありません。 –

+1

一歩を踏み出して、最初にリストがどのように構築されているかを考えてみてください。 – chepner

答えて

35

単純なリストの理解を使用して:

['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'] 

Noneシングルトンに合わせてis None試験に注意。 が長く、非効率的なしかし、forループ優しいが、それは次のようになります初心者使用

2

:のみ初心者のための

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答えは、パワーと効率の手段で、より適している

+1

'== None'を使わないでください。 'None'はシングルトンであり、' is None'はより速くよりpython的でPEP-8に準拠しています。 –

+0

@MartijnPietersもしそうなら... –

+0

それはあなたが意味するところは常に 'is None'を使います。 'i'は' None'との比較を 'True'として実装するタイプです。 –

1

リストの理解は正しい方法ですが、あなたに最もよく知られている理由から、新しいリストを作成するのではなく、代わりに置き換える(pythonリストが変更可能であるという事実を主張する)場合、続く

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'] 
6

あなたは、単にmapを使用してstr機能を使用して文字列にすべての項目変換することができます:あなたは短い形式でそれを行うことができますPythonの3.6以降

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

これは '1 'を' '1'に変え、OPサンプル出力はその値だけを残します。 –

+1

本当にありがとう!私は答えを編集しました... –

0

を:

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

これが誰かに役立つことを願って、私はちょっと前にこの問題を抱えていました。

関連する問題