webentwicklung-frage-antwort-db.com.de

Drucken Sie eine Liste der durch Leerzeichen getrennten Elemente in Python 3

Ich habe eine Liste L von Elementen, zB natürliche Zahlen. Ich möchte sie in einer Zeile mit einem ein Leerzeichen als Trennzeichen drucken. Aber ich will nicht ein Leerzeichen nach dem letzten Element der Liste (oder vor dem ersten).

In Python 2 ist dies mit dem folgenden Code problemlos möglich. Die Implementierung der print-Anweisung (mysteriöserweise muss ich gestehen), dass vor dem Zeilenumbruch kein zusätzlicher Platz gedruckt werden muss.

L = [1, 2, 3, 4, 5]
for x in L:
    print x,
print

In Python 3 scheint es jedoch, dass der (angeblich) äquivalente Code, der die print-Funktion verwendet, nach der letzten Zahl ein Leerzeichen erzeugt:

L = [1, 2, 3, 4, 5]
for x in L:
    print(x, end=" ")
print()

Natürlich gibt es einfache Antworten auf meine Frage. Ich weiß, dass ich String-Verkettung verwenden kann:

L = [1, 2, 3, 4, 5]
print(" ".join(str(x) for x in L))

Dies ist eine ziemlich gute Lösung, aber im Vergleich zum Python-2-Code finde ich es kontrapunktisch und definitiv langsamer. Ich weiß auch, dass ich wählen kann, ob ich ein Leerzeichen drucken möchte oder nicht.

L = [1, 2, 3, 4, 5]
for i, x in enumerate(L):
    print(" " if i>0 else "", x, sep="", end="")
print()

dies ist jedoch wiederum schlimmer als in Python 2.

Meine Frage ist also, fehlt mir in Python 3 etwas? Wird das von mir gesuchte Verhalten von der Funktion print unterstützt?

24
nickie

Sie können die Liste als separate Argumente anwenden:

print(*L)

und print() kümmert sich darum, jedes Element in einen String zu konvertieren. Sie können wie immer das Trennzeichen steuern, indem Sie das Argument sep eingeben:

>>> L = [1, 2, 3, 4, 5]
>>> print(*L)
1 2 3 4 5
>>> print(*L, sep=', ')
1, 2, 3, 4, 5
>>> print(*L, sep=' -> ')
1 -> 2 -> 3 -> 4 -> 5

Wenn Sie die verbundene Zeichenfolge nicht für etwas anderes benötigen, ist dies die einfachste Methode. Andernfalls verwenden Sie str.join():

joined_string = ' '.join([str(v) for v in L])
print(joined_string)
# do other things with joined_string

Beachten Sie, dass dies eine manuelle Konvertierung in Zeichenfolgen für Nicht-Zeichenfolgenwerte in L erfordert!

67
Martijn Pieters

Obwohl die akzeptierte Antwort absolut klar ist, wollte ich nur die Effizienz in Bezug auf die Zeit überprüfen.

Am besten drucken Sie eine verbundene Zeichenfolge aus Zahlen, die in Zeichenfolgen umgewandelt wurden.

print(" ".join(list(map(str,l))))

Beachten Sie, dass ich map anstelle von loop ..__ verwendet habe. Ich habe einen kleinen Code aller 4 verschiedenen Möglichkeiten geschrieben, um die Zeit zu vergleichen:

import time as t

a, b = 10, 210000
l = list(range(10, 21000))
tic = t.time()
for i in l:
    print(i, end=" ")

print()
tac = t.time()
t1 = (tac - tic) * 1000
print(*l)
toe = t.time()
t2 = (toe - tac) * 1000
print(" ".join([str(i) for i in l]))
joe = t.time()
t3 = (joe - toe) * 1000
print(" ".join(list(map(str, l))))
toy = t.time()
t4 = (toy - joe) * 1000
print("Time,t1,t2,t3,t4")

Ergebnis:

Zeit 74344,76 71790,83 196,99 153,99

Die Ausgabe war für mich ziemlich überraschend. Große Zeitdifferenz bei 'Loop-Methode' und 'Join-String-Methode'.

Fazit: Verwenden Sie keine Schleifen für die Druckliste, wenn die Größe zu groß ist (in der Größenordnung von 10 ** 5 oder mehr).

1
Amit Dwivedi
list = [1, 2, 3, 4, 5]
for i in list[0:-1]:
    print(i, end=', ')
print(list[-1])

dauert es wirklich viel länger für Loops?

versuchte, etwas zu erstellen, das alle str-Werte in einer durch Kommas getrennten Liste druckte, "und" vor dem letzten Eintrag einfügte und folgendes ergab:

spam = ['apples', 'bananas', 'tofu', 'cats']
for i in spam[0:-1]:
    print(i, end=', ')
print('and ' + spam[-1])
0
mashkitty