2010-03-08 20 views
27

Considerate questo codice Python per stampare un elenco di valori separati da virgolapitone, stampa elenco delimitato

for element in list: 
    print element + ",", 

Qual è il metodo preferito per la stampa in modo tale che una virgola non compare se element è l'elemento finale della lista .

ex

a = [1, 2, 3] 
for element in a 
    print str(element) +",", 

output 
1,2,3, 
desired 
1,2,3 
+3

Eventuali duplicati di [Come si dovrebbe fare un separato da virgole stringa da un elenco?] (http://stackoverflow.com/questions/44778/how-would-you-make-a-comma-separated-string-from-a-list) – manetsus

risposta

75
>>> ','.join(map(str,a)) 
'1,2,3' 
+1

+1 per ricordare che devi prima convertire in 'str'. –

+6

+1 per un buon codice, -1 per non inserire uno spazio tra str e a. –

+5

spazi sono per i polloni –

2

Questo è quello che è per join.

','.join([str(elem) for elem in a]) 
+1

'TypeError: sequence item 0: expected stringa, int trovata.'Non funziona per il suo input di esempio. – Ponkadoodle

+0

Giusto, scusa. Non converte automaticamente gli interi in stringhe. Risolto con una nifty list comprehension. – MatrixFrog

+6

Non utilizzare una comprensione di lista. Elimina '[]' s e creerà un generatore, che funzionerà altrettanto bene senza creare un elenco temporaneo non necessario (potenzialmente grande). –

0
print ','.join(a) 
+0

'join' non converte automaticamente le stringhe in stringhe, quindi non funzionerà. –

+0

@musicfreak Ti sembra stupido che non lo str() automaticamente? Dopotutto, ".join() è un metodo String. Mi chiedo perché non lo faccia gratis. – orokusaki

+1

@orokusaki: Va contro il precetto "Explicit is better than implicit". –

12

Un ','.join come suggerito in altre risposte è la soluzione tipica Python; l'approccio normale, che tipicamente non vedo in nessuna delle risposte finora, è

print ','.join(str(x) for x in a) 

conosciuto come un generatore di espressione o genexp.

Se si preferisce un loop (o bisogno di uno per altri scopi, se si sta facendo più di una semplice stampa su ciascuna voce, per esempio), ci sono naturalmente anche ottime alternative:

for i, x in enumerate(a): 
    if i: print ',' + str(x), 
    else: print str(x), 

questo è un interruttore per la prima volta (funziona per qualsiasi iterable a, se un elenco o altro) quindi colloca la virgola prima di ogni elemento tranne il primo. Un interruttore ultima volta è leggermente meno elegante e funziona solo per iterables aventi un len() (quelli non per tutto generale):

for i, x in enumerate(a): 
    if i == len(a) - 1: print str(x) 
    else: print str(x) + ',', 

questo esempio sfrutta anche l'interruttore dell'ultimo tempo per terminare la linea quando sta stampando l'ultimo oggetto.

La funzione integrata enumerate è molto utile e vale la pena tenerla a mente!

+0

è buona, ma nel caso dell'OP, è sufficiente un join semplice. – ghostdog74

+1

Certo, è quello che ho iniziato con (dare il genexp in un momento in cui altre risposte avevano mappe, liste o nessuna conversione in stringa) - hai _seen_ il primo paragrafo di questa risposta, forse? -) Prima volta e gli switch dell'ultima ora sono più versatili, e nessun'altra risposta li ha mai menzionati, quindi ho scelto di indicarli anche, ovviamente (compreso il fatto che sono fatti meglio per enumerare). –

+0

Guardando la tua risposta e guardando la risposta di ghostdog, mi chiedo qualcosa. La comprensione di una lista usa più memoria di quella del suo esempio, ma map() è più lenta di un LH? A proposito, ho consigliato il tuo libro a qualcuno che mi ha mandato un'email di aiuto su Python :) – orokusaki

-3
>>> a=[1,2,3] 
>>> a=[str(i) for i in a ] 
>>> s=a[0] 
>>> for i in a[1:-1]: s="%s,%s"%(s,i) 
... 
>>> s=s+","+a[-1] 
>>> s 
'1,2,3' 
+0

Devo supporre che stia scherzando – Mike

-1
def stringTokenizer(sentense,delimiters): 
    list=[] 
    word="" 
    isInWord=False 
    for ch in sentense: 
     if ch in delimiters: 
      if isInWord: # start ow word 
       print(word) 
       list.append(word) 
       isInWord=False 
     else: 
      if not isInWord: # end of word 
       word="" 
       isInWord=True 
      word=word+ch 
    if isInWord: # end of word at end of sentence 
      print(word) 
      list.append(word) 
      isInWord=False 
    return list 

stampa (StringTokenizer (u "привет парни! Я вам стихами, может быть, еще отвечу", "!"))

+0

Ho sostituito la stringa di esempio perché è troppo offensiva per il russo parlato. –

1

ci sono due opzioni,

È può stampare direttamente la risposta usando print(*a, sep=',') questo userà il separatore come "," otterrete la risposta come,

1,2,3 

e un'altra opzione è,

print(','.join(str(x) for x in list(a))) 

questo scorrere l'elenco e stampare il (a) e stampare l'output come

1,2,3 
Problemi correlati