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

StackOverflow https://stackoverflow.com/questions/44778

  •  09-06-2019
  •  | 
  •  

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+....)

War es hilfreich?

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:

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 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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top