Wie würden Sie eine durch Kommas getrennte Zeichenfolge aus einer Liste von Zeichenfolgen erstellen?


528

Was wäre Ihre bevorzugte Methode, um Zeichenfolgen aus einer Sequenz so zu verketten, dass zwischen jeweils zwei aufeinander folgenden Paaren ein Komma hinzugefügt wird? Das heißt, wie ordnen Sie zum Beispiel ['a', 'b', 'c']zu 'a,b,c'? (Die Fälle ['s']und []sollten abgebildet werden 's'und ''sind.)

Normalerweise benutze ich so etwas ''.join(map(lambda x: x+',',l))[:-1], fühle mich aber auch etwas unzufrieden.

Antworten:


969
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'

Dies funktioniert nicht, wenn die Liste Ganzzahlen enthält


Und wenn die Liste Nicht-String-Typen enthält (z. B. Ganzzahlen, Gleitkommazahlen, Bools, Keine), gehen Sie wie folgt vor:

my_string = ','.join(map(str, my_list)) 

Hinweis: Wenn Sie Python 2.7 verwenden (was Sie jetzt noch nicht tun sollten), löst die Verwendung von str eine Ausnahme aus, wenn ein Element in der Liste Unicode enthält.
Kroiz

75

Warum die map/ lambdaMagie? Funktioniert das nicht

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

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

Falls die Liste Zahlen enthält, können Sie das Listenverständnis verwenden:

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

oder ein Generatorausdruck:

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

18

",".join(l)funktioniert nicht in allen Fällen. 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'

Es gibt keine StringIOin Python 3
Ron Kalian

4
@ RonKalian Verwendung from io import StringIOin Python 3
Kevin Ashcraft

13

Hier ist eine alternative Lösung in Python 3.0, die Listenelemente ohne Zeichenfolge zulässt:

>>> alist = ['a', 1, (2, 'b')]
  • ein Standardweg

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
  • die alternative Lösung

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

HINWEIS: Das Leerzeichen nach dem Komma ist beabsichtigt.


11

Willst du nicht einfach:

",".join(l)

Offensichtlich wird es komplizierter, wenn Sie Kommas usw. in den Werten in Anführungszeichen setzen müssen. In diesem Fall würde ich vorschlagen, das CSV-Modul in der Standardbibliothek zu betrachten:

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


10

@ Peter Hoffmann

Die Verwendung von Generatorausdrücken hat den Vorteil, dass auch ein Iterator erstellt wird, spart jedoch den Import von itertools. Darüber hinaus werden Listenverständnisse im Allgemeinen der Zuordnung vorgezogen. Daher würde ich erwarten, dass Generatorausdrücke der Imap vorgezogen werden.

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

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

my_listkann jede Art von Variablen enthalten. Dies vermeidet das Ergebnis 'A,,,D,E'.


4
l=['a', 1, 'b', 2]

print str(l)[1:-1]

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

1
Ich denke, Sie sollten darauf hinweisen, dass Sie im Gegensatz zu den anderen Lösungen auf dieser Seite auch Zeichenfolgen zitieren.
Mrdevlar

3

@ jmanning2k mit einem Listenverständnis hat den Nachteil, eine neue temporäre Liste zu erstellen. Die bessere Lösung wäre die Verwendung von itertools.imap, die einen Iterator zurückgibt

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

Diese Lösung erfüllt nicht die Anforderungen, kein zusätzliches Komma für eine leere Zeichenfolge hinzuzufügen und mit NoneType ein 'None' hinzuzufügen.
Roberto

Überprüfen Sie die str.join Arbeit schneller mitlist im Vergleich zum Generator
Grijesh Chauhan

3

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

1
Diese Frage betraf Listen, keine Listen von Listen .
Eero Aaltonen

@EeroAaltonen Ich habe meine Antwort aktualisiert. Danke, dass du mich nach rechts gezeigt hast.

1

Ich würde sagen, dass die csvBibliothek hier die einzig sinnvolle Option ist, da sie für alle CSV-Anwendungsfälle wie Kommas in einer Zeichenfolge usw. entwickelt wurde.

Eine Liste ausgeben l in eine CSV-Datei aus:

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, writer.writerows(iterable)mehrere Zeilen an csv auszugeben.

Dieses Beispiel ist mit Python 3 kompatibel, da die andere hier verwendete Antwort StringIOPython 2 ist.


Aber ist das nicht zu viel / kompliziert im Vergleich zu anderen Antworten?
Sreenikethan I

0

Wenn ich nichts vermisse, ','.join(foo)sollte ich tun, wonach Sie fragen.

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

(edit: und wie jmanning2k betont,

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

ist sicherer und ziemlich pythonisch, obwohl die resultierende Zeichenfolge schwer zu analysieren ist, wenn die Elemente Kommas enthalten können - an diesem Punkt benötigen Sie die volle Leistung des csvModuls, wie Douglas in seiner Antwort hervorhebt.)


-2

Meine zwei Cent. Ich mag einfacher einen 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 erfüllt die Anforderungen. Wenn die Liste keine Zahlen enthält, 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 gezeigt (danke).


Das ist überflüssig. Die akzeptierte Antwort ist einfach, direkt und eindeutig die beste Lösung. Zu komplexe Alternativen anzubieten ist sinnlose Zeitverschwendung. Wenn Sie lediglich versuchen, sich über andere Merkmale der Sprache zu informieren, wenn es bereits tragfähige Antworten gibt, tun Sie dasselbe, wofür Sie mich herabgestimmt haben.
klares Licht
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.