Wie drucke ich eine Liste „richtig“?

95

Also habe ich eine Liste:

['x', 3, 'b']

Und ich möchte, dass die Ausgabe ist:

[x, 3, b]

Wie kann ich das in Python machen?

Wenn ich das tue str(['x', 3, 'b']), bekomme ich eins mit Anführungszeichen, aber ich möchte keine Anführungszeichen.

Obaid
quelle
Um zu erklären, warum die Liste nicht "richtig" gedruckt wird, werden print(["Sam"])Aufrufe repr("Sam"), die 'Sam'(mit Anführungszeichen) zurückgegeben werden, anders als beim Aufrufen print("Sam")und Python-Aufrufe, str("Sam")die zurückgegeben werden Sam(ohne Anführungszeichen). Weitere Informationen finden Sie unter Unterschied zwischen strundrepr oder Python strund lists .
Anonym

Antworten:

188

In Python 2:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

In Python 3 (wo printist eine eingebaute Funktion und keine Syntaxfunktion mehr):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

Beide kehren zurück:

[x, 3, b]

Hierbei wird die map()Funktion verwendet, um str für jedes Element von mylist aufzurufen und eine neue Liste von Zeichenfolgen zu erstellen , die dann zu einer Zeichenfolge mit verbunden werden str.join(). Dann ersetzt der %Zeichenfolgenformatierungsoperator die Zeichenfolge in statt %sin "[%s]".

SingleNegationElimination
quelle
4
Danke, das funktioniert super. Können Sie in der zweiten Zeile etwas näher erläutern, was Sie tun? Ich bin neu in Python.
Obaid
19
Er verwendet die mapFunktion, strum jedes Element von aufzurufen mylistund eine neue Liste von Zeichenfolgen zu erstellen, mit denen er dann eine Zeichenfolge zusammenfügt str.join. Anschließend verwendet er den %Zeichenfolgenformatierungsoperator, um die Zeichenfolge anstelle von %sin zu ersetzen "[%s]".
li.davidm
6
Eine andere Möglichkeit, die vielleicht etwas moderner ist: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor
2
Ich bevorzuge map(f, xs)(oder imapin python2.x) (f(x) for x in xs), wenn fein vordefinierter Aufruf möglich ist. Das führt tendenziell weniger Bytecodes aus und ist normalerweise kompakter. Sicherlich ist das nicht map(lambda x:..., xs) viel schlimmer als(... for x in xs)
SingleNegationElimination
1
@ user1767754: wirklich? Verknüpfung?
SingleNegationElimination
18

Dies ist einfacher Code. Wenn Sie neu sind, sollten Sie ihn leicht genug verstehen.

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

Es druckt sie alle ohne Anführungszeichen, wie Sie wollten.

reemer9997
quelle
15

Nur Druck verwenden:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b
Finn
quelle
14

Wenn Sie Python3 verwenden:

print('[',end='');print(*L, sep=', ', end='');print(']')
Kabie
quelle
1
Was macht print (* L) hier?
Sandeeps
1
Das verwirrt mich. Filtert der lange Datentyp die Liste irgendwie?
dval
Eine prägnantere Version wäreprint(end='['); print(*l, sep=', ', end=']\n')
Anonymous
9

Anstatt zu verwenden map, würde ich empfehlen, einen Generatorausdruck joinzu verwenden, der einen Iterator akzeptieren kann:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

Hier joinist eine Member-Funktion der String-Klasse str. Es wird ein Argument benötigt: eine Liste (oder ein Iterator) von Zeichenfolgen, die dann eine neue Zeichenfolge mit allen in diesem Fall verketteten Elementen zurückgibt ,.

Seth Johnson
quelle
2
Eine gute Optimierung für Python 2, da map eine Liste in 2.x zurückgibt. Es gibt einen Generator in 3.x zurück, daher hilft es dort nicht so viel.
Tom Zych
7
Ich würde zurückkehren", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem
@eyquem: Clever, ich habe noch nie gesehen, dass Join so verwendet wurde. Für Anfänger ist dies jedoch etwas undurchsichtiger (da Sie die Eigenschaft verwenden, dass eine Zeichenfolge ein iterierbarer Container mit Zeichenfolgen mit einem Zeichen ist).
Seth Johnson
6

Sie können alle unerwünschten Zeichen aus einer Zeichenfolge löschen, indem Sie die translate()Methode mit Nonefür das tableArgument verwenden, gefolgt von einer Zeichenfolge, die die Zeichen enthält, die für das deletecharsArgument entfernt werden sollen.

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

Wenn Sie eine Version von Python vor 2.6 verwenden, müssen Sie stattdessen stringdie translate()Funktion des Moduls verwenden, da die Möglichkeit, Noneals tableArgument zu übergeben, erst mit Python 2.6 hinzugefügt wurde. Die Verwendung sieht folgendermaßen aus:

import string

print string.translate(str(lst), None, "'")

Die Verwendung der string.translate()Funktion funktioniert auch in Version 2.6+, daher ist die Verwendung möglicherweise vorzuziehen.

Martineau
quelle
2
Ach: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]und auch mitlst = ['it isn\'t', 3, 'b']
eyquem
1
@eyquem: Ja, um das Löschen von Zeichen zu vermeiden, die tatsächlich Teil Ihrer Daten sind (anstatt ausschließlich zur Abgrenzung verwendet zu werden), wäre natürlich eine etwas ausgefeiltere / andere Logik erforderlich, wenn dies möglich ist.
Martineau
3

Hier ist eine interaktive Sitzung, die einige der Schritte in @ TokenMacGuys Einzeiler zeigt. Zuerst verwendet er die mapFunktion, um jedes Element in der Liste in eine Zeichenfolge zu konvertieren (tatsächlich erstellt er eine neue Liste, nicht die Elemente in der alten Liste). Dann verwendet er die String-Methode join, um diese Strings mit ', 'ihnen zu kombinieren . Der Rest ist nur die Formatierung von Zeichenfolgen, was ziemlich einfach ist. (Bearbeiten: Diese Instanz ist unkompliziert. Die Formatierung von Zeichenfolgen kann im Allgemeinen etwas komplex sein.)

Beachten Sie, dass die Verwendung joineine einfache und effiziente Methode zum Erstellen einer Zeichenfolge aus mehreren Teilzeichenfolgen ist, die viel effizienter ist als das sukzessive Hinzufügen von Zeichenfolgen zu Zeichenfolgen, was viel Kopieren hinter den Kulissen erfordert.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'
Tom Zych
quelle
2

Verwenden .formatfür die Formatierung von Zeichenfolgen,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

Ausgabe:

[x, 3, b]

Erläuterung:

  1. mapwird verwendet, um jedes Element der Liste dem stringTyp zuzuordnen .
  2. Die Elemente werden zu einem String mit ,Trennzeichen zusammengefügt.
  3. Wir verwenden [und ]in der print-Anweisung, um die Listenklammern anzuzeigen.

Referenz: .formatzur Formatierung von Zeichenfolgen PEP-3101

Ani Menon
quelle
Toll! Ich finde es .formatam pythonischsten. Aber natürlich akzeptiere ich Meinungsverschiedenheiten. ;)
geliebt von Jesus
0

Ich wurde von @AniMenon inspiriert, eine allgemeinere pythonische Lösung zu schreiben.

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

Es wird nur die formatMethode verwendet. Keine Spur von str, und es ermöglicht die Feinabstimmung des Elementformats. Wenn Sie beispielsweise Gleitkommazahlen als Elemente der Liste haben, können Sie deren Format anpassen, indem Sie in diesem Fall einen Konvertierungsspezifizierer hinzufügen:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

Die Ausgabe ist recht anständig:

[1.85, -6.33, 4000.21]
geliebt von Jesus
quelle