Domanda

Quale sarebbe il tuo modo preferito per concatenare stringhe da una sequenza in modo tale che tra ogni due coppie consecutive venga aggiunta una virgola.Cioè, come si mappa, ad esempio, [ 'a', 'b', 'c' ] A 'a,b,c'?(I casi [ s ] E [] dovrebbe essere mappato su s E '', rispettivamente.)

Di solito finisco per usare qualcosa del genere ''.join(map(lambda x: x+',',l))[:-1], ma anche sentirsi un po' insoddisfatti.

Modificare:Mi vergogno e allo stesso tempo sono felice che la soluzione sia così semplice.Ovviamente non ho quasi la minima idea di quello che sto facendo.(Probabilmente in passato avevo bisogno di una concatenazione "semplice" e in qualche modo l'ho memorizzata s.join([e1,e2,...]) come abbreviazione di s+e1+e2+....)

È stato utile?

Soluzione

myList = ['a','b','c','d']
myString = ",".join(myList )

Questo non funzionerà se l'elenco contiene numeri.


COME Ricardo Reyes suggerito, se contiene tipi non stringa (come numeri interi, float, bool, None), eseguire:

myList = ','.join(map(str, myList)) 

Altri suggerimenti

Perché la magia mappa/lambda?Non funziona?

>>>foo = [ 'a', 'b', 'c' ]
>>>print ",".join(foo)
a,b,c
>>>print ",".join([])

>>>print ",".join(['a'])
a

Modificare:@mark-biek sottolinea il caso dei numeri.Forse la comprensione dell'elenco:

>>>','.join([str(x) for x in foo])

è più "pitonico".

Modifica2:Grazie per i suggerimentiIn futuro utilizzerò il generatore anziché la comprensione delle liste.

>>>','.join(str(x) for x in foo)

",".join(l) non funzionerà per tutti i casi.Suggerirei di utilizzare il modulo CSV con StringIO

import StringIO
import csv

l = ['list','of','["""crazy"quotes"and\'',123,'other things']

line = StringIO.StringIO()
writer = csv.writer(line)
writer.writerow(l)
csvcontent = line.getvalue()
# 'list,of,"[""""""crazy""quotes""and\'",123,other things\r\n'

Ecco una soluzione alternativa in Python 3.0 che consente elementi di elenco non stringa:

>>> alist = ['a', 1, (2, 'b')]
  • un modo standard

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
    
  • la soluzione alternativa

    >>> import io
    >>> s = io.StringIO()
    >>> print(*alist, file=s, sep=', ', end='')
    >>> s.getvalue()
    "a, 1, (2, 'b')"
    

NOTA:Lo spazio dopo la virgola è intenzionale.

@Pietro Hoffmann

L'utilizzo delle espressioni del generatore ha il vantaggio di produrre anche un iteratore ma consente di risparmiare l'importazione di itertools.Inoltre, le comprensioni delle liste sono generalmente preferite alla mappatura, quindi mi aspetterei che le espressioni del generatore siano preferite a imap.

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 

Non vuoi solo:

",".join(l)

Ovviamente diventa più complicato se è necessario mettere tra virgolette/escape virgole ecc. nei valori.In tal caso suggerirei di guardare il modulo csv nella libreria standard:

https://docs.python.org/library/csv.html

>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

my_list può contenere qualsiasi tipo di variabile.Questo evita il risultato 'A,,,D,E'.

@jmanning2k utilizzando una comprensione di elenco ha lo svantaggio di creare un nuovo elenco temporaneo.La soluzione migliore sarebbe utilizzare itertools.imap che restituisce un iteratore

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))

per convertire l'elenco contenente numeri, procedere come segue:

string  =  ''.join([str(i) for i in list])
l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"

A meno che non mi manchi qualcosa, ','.join(foo) dovresti fare quello che chiedi.

>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'

(modificare:e come sottolinea jmanning2k,

','.join([str(x) for x in foo])

è più sicuro e abbastanza Pythonic, anche se la stringa risultante sarà difficile da analizzare se gli elementi possono contenere virgole - a quel punto, hai bisogno di tutta la potenza del csv modulo, come sottolinea Douglas nella sua risposta.)

Ecco un esempio con la lista

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

Più accurato:-

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

Esempio 2:-

myList = ['Apple','Orange']
myList = ','.join(map(str, myList)) 
print "Output:", myList
Output: Apple,Orange

direi il csv libreria è l'unica opzione sensata qui, poiché è stata creata per far fronte a tutti i casi d'uso CSV come virgole in una stringa, ecc.

Per produrre un elenco l in un file .csv:

import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(l)  # this will output l as a single row.  

È anche possibile utilizzare writer.writerows(iterable) per generare più righe in CSV.

Questo esempio è compatibile con Python 3, come è stata utilizzata l'altra risposta qui StringIO che è Python 2.

solo qualcosa del genere :)

String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')

ring = (" , ").join(ding)

print(ring)

Produzione:Una volta, una volta, un tempo, molto tempo fa

I miei due centesimi.Mi piace più semplice un codice di una riga in Python:

>>> from itertools import imap, ifilter
>>> l = ['a', '', 'b', 1, None]
>>> ','.join(imap(str, ifilter(lambda x: x, l)))
a,b,1
>>> m = ['a', '', None]
>>> ','.join(imap(str, ifilter(lambda x: x, m)))
'a'

È Python, funziona con stringhe, numeri, None e stringhe vuote.È breve e soddisfa i requisiti.Se l'elenco non conterrà numeri, possiamo utilizzare questa variante più semplice:

>>> ','.join(ifilter(lambda x: x, l))

Anche questa soluzione non crea un nuovo elenco, ma utilizza un iteratore, come ha sottolineato @Peter Hoffmann (grazie).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top