2013-10-14 9 views
15

ho:Sostituisci nessun valore nell'elenco?

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

voglio sostituire il valore Nessuno per 'None' o qualsiasi stringa

effetto atteso:

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

una prova sostituire nella stringa e ciclo for ma ottengo errore:

TypeError: expected a character buffer object 
+2

Se è necessario attivare 'None' in una stringa per qualsiasi cosa si stia facendo successivamente (che si aspetta un oggetto buffer di caratteri), perché non è necessario trasformare il' 1' in una stringa pure? –

+1

Si consiglia di fare un passo indietro e considerare come l'elenco è costruito in primo luogo. – chepner

risposta

35

Utilizzare una semplice lista di comprensione:

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

Demo:

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

Nota il test is None per abbinare il None Singleton.

2

Utilizzando un lungo e inefficiente comunque principiante amichevole ciclo for sarebbe simile:

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

solo per i principianti, @Martins risposta è più adatto nei mezzi di potenza ed efficienza

+1

Non utilizzare '== Nessuno'; 'None' è un singleton, usando' is None' è più veloce e più pythonic e PEP-8 compatibile. –

+0

@MartijnPieters Se lo dici tu ... –

+0

Usa sempre 'is None' se questo è ciò che intendi. 'i' può essere un tipo che implementa il confronto con' None' come 'True'. –

1

La comprensione delle liste è la giusta strada da percorrere, ma nel caso, per le ragioni a te più note, preferiresti sostituirla sul posto piuttosto che creare una nuova lista (argomentando che l'elenco di python è mutevole), un approccio alternativo è come segue

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

Si può semplicemente utilizzare map e convertire tutti gli elementi in stringhe utilizzando la funzione str:

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

Questo trasformerebbe '1' in'''', l'output del campione OP lascia quel valore da solo. –

+1

è vero grazie! Ho modificato la risposta ... –

0

partire Python 3.6 è possibile farlo in forma più breve:

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

Spero che questo aiuti qualcuno da quando, stavo avendo questo problema solo un po 'di tempo fa.