Pythonische Methode zum Drucken von Listenelementen

114

Ich würde gerne wissen, ob es einen besseren Weg gibt, alle Objekte in einer Python-Liste zu drucken als diesen:

myList = [Person("Foo"), Person("Bar")]
print("\n".join(map(str, myList)))
Foo
Bar

Ich lese so ist nicht wirklich gut:

myList = [Person("Foo"), Person("Bar")]
for p in myList:
    print(p)

Gibt es nicht so etwas wie:

print(p) for p in myList

Wenn nicht, ist meine Frage ... warum? Wenn wir solche Dinge mit umfassenden Listen machen können, warum nicht als einfache Aussage außerhalb einer Liste?

Guillaume Voiron
quelle
3
Woher haben Sie den Eindruck, dass die Verwendung for p in myList"nicht wirklich gut" war?
Jon Clements
@ JonClements: chrisarndt.de/talks/rupy/2008/output/slides.html
Guillaume Voiron
@pelotasplus: überhaupt nicht :) Und übrigens mag ich meine erste Version nicht wirklich, die nicht "lesbar" ist
Guillaume Voiron

Antworten:

220

Angenommen, Sie verwenden Python 3.x:

print(*myList, sep='\n')

Sie können das gleiche Verhalten unter Python 2.x verwenden from __future__ import print_function, wie von mgilson in den Kommentaren angegeben.

Mit der print-Anweisung in Python 2.x benötigen Sie eine Iteration. In Bezug auf Ihre Frage, ob Sie print(p) for p in myListnicht funktionieren, können Sie einfach Folgendes verwenden, das das Gleiche tut und immer noch eine Zeile enthält:

for p in myList: print p

Für eine Lösung, die verwendet '\n'.join(), bevorzuge ich Listenverständnis und Generatoren, map()daher würde ich wahrscheinlich Folgendes verwenden:

print '\n'.join(str(p) for p in myList) 
Andrew Clark
quelle
3
Und wenn nicht, können Sie from __future__ import print_functionauf Python2.6 und neuer.
mgilson
In Python 2x ist die Verwendung von Map etwas schneller als die Verwendung von Join für ein Listenverständnis.
Juan Carlos Moreno
1
Warum das Downvote, liegt es wirklich am Geschwindigkeitsunterschied zwischen map()und einem Generator? Pythons Schöpfer bevorzugt auch Verständnis und Generatoren gegenübermap() .
Andrew Clark
Ich habe dich nicht abgelehnt. Ich kenne diesen Beitrag von GVR, mit dem er damals sagte, wie zukünftige Versionen von Python ihn nicht enthalten würden, aber sie blieben.
Juan Carlos Moreno
1
Sie sind zwar in Python 3.x geblieben, aber sein Punkt in diesem Artikel ist, dass dies [F(x) for x in S]klarer ist als map(F, S). Die Leistung wird dort nicht angesprochen, aber ich würde erwarten, dass der Geschwindigkeitsunterschied vernachlässigbar ist. Wie auch immer, ich war nur verwirrt über die Ablehnung, sorry, ich nahm an, dass du es warst!
Andrew Clark
28

Ich benutze das die ganze Zeit:

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])
lucasg
quelle
1
Um hinzuzufügen format(), ersetzen Sie die str(x)durch eine print " ".join(["{:02d}".format(x) for x in l])
Formatzeichenfolge
8

[print(a) for a in list] gibt am Ende eine Reihe von None-Typen an, obwohl alle Elemente ausgedruckt werden

ytpillai
quelle
Das habe ich bisher benutzt. Es ist eine Zeile, sehr klar und ausdrucksstark, aber weniger Beschwerden "Ausdruck ist nichts zugeordnet"
alete
1
Wenn Sie den Linter trollen möchten, können Sie eine separate Funktion
erstellen, die ihn ausdruckt
3

Für Python 2. *:

Wenn Sie die Funktion __str __ () für Ihre Personenklasse überladen, können Sie das Teil mit map (str, ...) weglassen. Eine andere Möglichkeit besteht darin, eine Funktion zu erstellen, wie Sie sie geschrieben haben:

def write_list(lst):
    for item in lst:
        print str(item) 

...

write_list(MyList)

In Python 3 gibt es das Argument sep für die Funktion print (). Schauen Sie sich die Dokumentation an.

Gukoff
quelle
3

Erweitern der Antwort von @ lucasg (inspiriert von dem erhaltenen Kommentar):

Um eine formatierte Listenausgabe zu erhalten, können Sie Folgendes tun:

l = [1,2,5]
print ", ".join('%02d'%x for x in l)

01, 02, 05

Jetzt ", "wird das Trennzeichen (nur zwischen Elementen, nicht am Ende) und die Formatierungszeichenfolge in '02d'Kombination mit %xeiner formatierten Zeichenfolge für jedes Element bereitgestellt x- in diesem Fall als Ganzzahl mit zwei Ziffern formatiert, links mit Nullen gefüllt.

Floris
quelle
2

Um jeden Inhalt anzuzeigen, verwende ich:

mylist = ['foo', 'bar']
indexval = 0
for i in range(len(mylist)):     
    print(mylist[indexval])
    indexval += 1

Beispiel für die Verwendung in einer Funktion:

def showAll(listname, startat):
   indexval = startat
   try:
      for i in range(len(mylist)):
         print(mylist[indexval])
         indexval = indexval + 1
   except IndexError:
      print('That index value you gave is out of range.')

Hoffe ich habe geholfen.

ShinyMemes
quelle
1
Bitte überprüfen Sie als Antwort die Antwort über Ihnen. Sie verwenden einen Bereich, der einen Indexwert liefert, i, aber Sie verwenden eine andere Variable, indexval, als Ihren Index? Sie kämpfen gegen die Einfachheit von Python. für val in my_list: print val macht dasselbe wie das, was du hast
BretD
1

Ich denke, dies ist am bequemsten, wenn Sie nur den Inhalt in der Liste sehen möchten:

myList = ['foo', 'bar']
print('myList is %s' % str(myList))

Einfach, leicht zu lesen und kann zusammen mit Formatzeichenfolgen verwendet werden.

Rongzhao Zhang
quelle
1

Die Frage von OP lautet: Gibt es so etwas wie Folgendes, wenn nicht, warum?

print(p) for p in myList # doesn't work, OP's intuition

Antwort ist, es existiert, was ist:

[p for p in myList] #works perfectly

Grundsätzlich []für das Listenverständnis verwenden und das printDrucken vermeiden None. Um zu sehen , warum printDrucke Nonesehen diese

Gaurav Singhal
quelle
1

Ich habe kürzlich einen Passwortgenerator erstellt und obwohl ich für Python SEHR NEU bin, habe ich diesen entwickelt, um alle Elemente in einer Liste anzuzeigen (mit kleinen Änderungen, die Ihren Anforderungen entsprechen ...

    x = 0
    up = 0
    passwordText = ""
    password = []
    userInput = int(input("Enter how many characters you want your password to be: "))
    print("\n\n\n") # spacing

    while x <= (userInput - 1): #loops as many times as the user inputs above
            password.extend([choice(groups.characters)]) #adds random character from groups file that has all lower/uppercase letters and all numbers
            x = x+1 #adds 1 to x w/o using x ++1 as I get many errors w/ that
            passwordText = passwordText + password[up]
            up = up+1 # same as x increase


    print(passwordText)

Wie gesagt, ich bin SEHR NEU in Python und ich bin mir sicher, dass dies für einen Experten viel zu klobig ist, aber ich bin nur für ein anderes Beispiel hier

Nate Baker
quelle
0

Angenommen, Ihre Liste wird gut gedruckt [1,2,3], dann ist ein einfacher Weg in Python3:

mylist=[1,2,3,'lorem','ipsum','dolor','sit','amet']

print(f"There are {len(mylist):d} items in this lorem list: {str(mylist):s}")

Wenn Sie dies ausführen, wird die folgende Ausgabe erzeugt:

Diese Lorem-Liste enthält 8 Elemente: [1, 2, 3, 'Lorem', 'Ipsum', 'Dolor', 'Sit', 'Amet']

Aethalogenide
quelle