2008-09-04 7 views
288

Was wäre Ihre bevorzugte Art, Strings aus einer Sequenz zu verketten, so dass zwischen jeweils zwei aufeinanderfolgenden Paaren ein Komma hinzugefügt wird. Das heißt, wie mappen Sie beispielsweise [ 'a', 'b', 'c' ] zu 'a,b,c'? (Die Fälle [ s ] und [] sollten jeweils s und '', abgebildet werden.)Wie würden Sie eine kommagetrennte Zeichenfolge aus einer Liste erstellen?

ich in der Regel so etwas wie ''.join(map(lambda x: x+',',l))[:-1] am Ende mit, sondern auch das Gefühl etwas unzufrieden.

Edit: Ich bin beide beschämt und glücklich, dass die Lösung so einfach ist. Offensichtlich habe ich kaum eine Ahnung, was ich mache. (Ich wahrscheinlich „einfache“ Verkettung in der Vergangenheit benötigt und irgendwie s.join([e1,e2,...]) als Abkürzung für s+e1+e2+... gespeichert.)

Antwort

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

Das wird nicht funktionieren, wenn die Listennummern enthalten.


Als Ricardo Reyes vorgeschlagen, wenn es nicht-String-Typen enthält (wie ganze Zahlen, Schwimmern, bools, None), dann tun:

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

Sie haben Recht, es wird nicht funktionieren, wenn die Liste Zahlen enthält, aber auf diese Weise wird es: myList = ','. Join (Karte (str, myList)) –

+0

Ah toll! Ich werde map() in Zukunft verwenden. Ich habe immer getan: myString = ",". Join ([str (x) für x in myList]) –

+6

'myString =", ". Join (myList)' auch wenn die Liste Zahlen enthält. Ich habe es gerade ausprobiert. – zengr

55

Warum die Karte/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 den Fall für Zahlen. Vielleicht ist die Liste Verständnis:

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

ist mehr "pythonic".

Edit2: Danke für die Vorschläge. Ich werde in Zukunft eher den Generator als das Listenverständnis verwenden.

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

'>>> ','. Join (str (x) für x in foo)' ist ziemlich cool !! – Marslo

+3

Was ist, wenn ich 'a, b und c' möchte? – Hussain

+0

@Hussain: '", ".join (foo [: - 2] + [" und ".join (foo [-2:])]]) oder wenn du Zahlen bekommst:' "," .join (itertools .chain ((str (i) für i in a [: - 2]), ["und" .join (str (i) für i in a [-2:])])) ' –

10

Sie wollen nicht nur:

",".join(l) 

Offensichtlich es komplizierter wird, wenn Sie Kommas etc zitieren/entkommen in den Werten müssen. In diesem Fall würde ich im csv-Modul in der Standardbibliothek empfehlen suchen:

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

1

Es sei denn, ich etwas fehle, ','.join(foo) sollte das tun, was Sie für Fragen.

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

(edit: und wie jmanning2k weist darauf hin,

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

ist sicherer und ganz Pythonic, obwohl die resultierende Zeichenfolge schwierig sein wird, zu analysieren, wenn die Elemente Kommas enthalten können - an diesem Punkt, Sie brauchen die volle Leistung des Moduls csv, wie Douglas in seiner Antwort hervorhebt.)

4

@ 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

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

Diese Lösung tut dies nicht Erfüllen Sie die Anforderungen, dass kein zusätzliches Komma für eine leere Zeichenfolge hinzugefügt wird, und fügen Sie mit NoneType eine "None" hinzu. – Roberto

8

@ Peter Hoffmann

Mit Generator Ausdrücke gibt hat den Vorteil, auch einen Iterator produzieren, sondern spart Import itertools. Darüber hinaus werden Listenkompressen im Allgemeinen bevorzugt, um zu mappen, daher würde ich erwarten, dass Generatorausdrücke gegenüber Imap bevorzugt werden.

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

print str(l)[1:-1] 

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

Ich denke, Sie sollten darauf hinweisen, dass Sie im Gegensatz zu den anderen Lösungen auf dieser Seite auch Strings zitieren. – mrdevlar

8

Hier ist eine alternative Lösung in Python 3.0, welche Elemente nicht-String-Liste erlaubt:

>>> alist = ['a', 1, (2, 'b')] 
  • eine Standardmethode

    >>> ", ".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: Der Raum hinter dem Komma ist beabsichtigt.

3

für Liste Umwandlung mit Zahlen wie folgt vor:

string = ''.join([str(i) for i in list]) 
7

",".join(l) wird für alle Fälle nicht. Ich würde vorschlagen, das csv-Modul mit 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' 
0

Hier verwendet, ist ein Beispiel mit Liste

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

Genaueres: -

>>> 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 
+0

Bei dieser Frage ging es um Listen, nicht * Listen von Listen *. –

+0

@EeroAaltonen I aktualisiert Meine Antwort, Danke, dass Sie mich nach rechts gerichtet haben. –

2
>>> 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'.

-1

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 pythonic, arbeitet für Strings, Zahlen, keine und leere Zeichenkette. Es ist kurz und erfüllt die Anforderungen. Wenn die Liste nicht Zahlen gehen enthalten, können wir diese einfachere Variante verwenden:

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

Auch ist diese Lösung nicht eine neue Liste erstellen, nutzt aber einen Iterator, wie @ Peter Hoffmann (danke) zeigte.

+0

Das ist überflüssig. Die akzeptierte Antwort ist einfach, direkt und eindeutig die beste Lösung. Übermäßig komplexe Alternativen zu bieten, ist sinnlose Zeitverschwendung. Wenn Sie nur versuchen, über andere Merkmale der Sprache aufzuklären, wenn es bereits eine tragfähige Antwort gibt, tun Sie das gleiche, für das Sie mich abgelehnt haben. – clearlight