Wie würden Sie aus einer Liste von Zeichenfolgen eine durch Kommas getrennte Zeichenfolge erstellen?
Frage
Was wäre Ihre bevorzugte Methode, um Zeichenfolgen aus einer Sequenz so zu verketten, dass zwischen zwei aufeinanderfolgenden Paaren jeweils ein Komma eingefügt wird?Das heißt, wie kartiert man zum Beispiel [ 'a', 'b', 'c' ]
Zu 'a,b,c'
?(Die Fälle [ s ]
Und []
zugeordnet werden soll s
Und ''
, jeweils.)
Normalerweise benutze ich so etwas wie ''.join(map(lambda x: x+',',l))[:-1]
, aber auch etwas unzufrieden.
Bearbeiten:Ich schäme mich und bin gleichzeitig froh, dass die Lösung so einfach ist.Offensichtlich habe ich kaum eine Ahnung, was ich tue.(Wahrscheinlich brauchte ich in der Vergangenheit eine „einfache“ Verkettung und habe sie irgendwie auswendig gelernt s.join([e1,e2,...])
als Abkürzung für s+e1+e2+...
.)
Lösung
myList = ['a','b','c','d']
myString = ",".join(myList )
Dies funktioniert nicht, wenn die Liste Zahlen enthält.
Als Ricardo Reyes Empfohlen: Wenn es Nicht-String-Typen enthält (z. B. Ganzzahlen, Gleitkommazahlen, Bool-Werte, Keine), dann gehen Sie wie folgt vor:
myList = ','.join(map(str, myList))
Andere Tipps
Warum die Karten-/Lambda-Magie?Funktioniert das nicht?
>>>foo = [ 'a', 'b', 'c' ]
>>>print ",".join(foo)
a,b,c
>>>print ",".join([])
>>>print ",".join(['a'])
a
Bearbeiten:@mark-biek weist auf die Argumente für Zahlen hin.Vielleicht das Listenverständnis:
>>>','.join([str(x) for x in foo])
ist eher „pythonisch“.
Edit2:Danke für die Vorschläge.Ich werde in Zukunft den Generator anstelle des Listenverständnisses verwenden.
>>>','.join(str(x) for x in foo)
",".join(l)
wird nicht in allen Fällen funktionieren.Ich würde vorschlagen, das CSV-Modul mit StringIO zu verwenden
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'
Hier ist eine alternative Lösung in Python 3.0, die Nicht-String-Listenelemente zulässt:
>>> alist = ['a', 1, (2, 'b')]
ein Standardweg
>>> ", ".join(map(str, alist)) "a, 1, (2, 'b')"
die Alternativlösung
>>> import io >>> s = io.StringIO() >>> print(*alist, file=s, sep=', ', end='') >>> s.getvalue() "a, 1, (2, 'b')"
NOTIZ:Das Leerzeichen nach dem Komma ist beabsichtigt.
@Peter Hoffmann
Die Verwendung von Generatorausdrücken hat den Vorteil, dass auch ein Iterator erstellt wird, erspart aber den Import von Itertools.Darüber hinaus werden Listenverständnisse im Allgemeinen dem Mapping vorgezogen, daher gehe ich davon aus, dass Generatorausdrücke dem Imap vorgezogen werden.
>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar'
Wollen Sie nicht nur:
",".join(l)
Offensichtlich wird es komplizierter, wenn Sie in den Werten Anführungszeichen/Escape-Kommas usw. verwenden müssen.In diesem Fall würde ich vorschlagen, einen Blick auf das CSV-Modul in der Standardbibliothek zu werfen:
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'
my_list
kann jede Art von Variablen enthalten.Dies vermeidet das Ergebnis 'A,,,D,E'
.
@jmanning2k, das ein Listenverständnis verwendet, hat den Nachteil, dass eine neue temporäre Liste erstellt wird.Die bessere Lösung wäre die Verwendung von itertools.imap, das einen Iterator zurückgibt
from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
Gehen Sie zum Konvertieren einer Liste mit Zahlen wie folgt vor:
string = ''.join([str(i) for i in list])
l=['a', 1, 'b', 2]
print str(l)[1:-1]
Output: "'a', 1, 'b', 2"
Es sei denn, ich übersehe etwas, ','.join(foo)
sollte tun, was Sie verlangen.
>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'
(bearbeiten:und wie jmanning2k betont,
','.join([str(x) for x in foo])
ist sicherer und ziemlich pythonisch, obwohl die resultierende Zeichenfolge schwierig zu analysieren ist, wenn die Elemente Kommas enthalten können – an diesem Punkt benötigen Sie die volle Leistungsfähigkeit von csv
Modul, wie Douglas in seiner Antwort betont.)
Hier ist ein Beispiel mit Liste
>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [i[0] for i in myList]))
>>> print "Output:", myList
Output: Apple,Orange
Genauer:-
>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList]))
>>> print "Output:", myList
Output: Apple,Orange
Beispiel 2:-
myList = ['Apple','Orange']
myList = ','.join(map(str, myList))
print "Output:", myList
Output: Apple,Orange
Ich würde das sagen csv
Die Bibliothek ist hier die einzig sinnvolle Option, da sie für alle CSV-Anwendungsfälle wie Kommas in einer Zeichenfolge usw. entwickelt wurde.
Um eine Liste auszugeben l
in eine CSV-Datei:
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.
Es ist auch möglich, es zu verwenden writer.writerows(iterable)
um mehrere Zeilen als CSV auszugeben.
Dieses Beispiel ist mit Python 3 kompatibel, da die andere hier verwendete Antwort verwendet wurde StringIO
Das ist Python 2.
nur so eine Kleinigkeit :)
String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')
ring = (" , ").join(ding)
print(ring)
Ausgabe:Es war einmal, vor einiger Zeit, vor langer Zeit, vor langer Zeit
Meine zwei Cent.Ich mag einen einfacheren einzeiligen Code 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'
Es ist pythonisch und funktioniert für Zeichenfolgen, Zahlen, Keine und leere Zeichenfolgen.Es ist kurz und genügt den Anforderungen.Wenn die Liste keine Zahlen enthalten soll, können wir diese einfachere Variante verwenden:
>>> ','.join(ifilter(lambda x: x, l))
Auch diese Lösung erstellt keine neue Liste, sondern verwendet einen Iterator, wie @Peter Hoffmann zeigte (danke).