Pythonic sposób drukowania elementów listy

114

Chciałbym wiedzieć, czy istnieje lepszy sposób na wydrukowanie wszystkich obiektów na liście w Pythonie niż ten:

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

Czytam w ten sposób, nie jest to dobre:

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

Czy nie ma czegoś takiego:

print(p) for p in myList

Jeśli nie, moje pytanie brzmi ... dlaczego? Jeśli możemy zrobić tego rodzaju rzeczy z obszernymi listami, dlaczego nie jako proste oświadczenie poza listą?

Guillaume Voiron
źródło
3
Gdzie odniosłeś wrażenie, że używanie for p in myListbyło „niezbyt dobre”?
Jon Clements
@JonClements: chrisarndt.de/talks/rupy/2008/output/slides.html
Guillaume Voiron
@pelotasplus: wcale :) A tak przy okazji, nie podoba mi się moja pierwsza wersja, która jest nieczytelna
Guillaume Voiron

Odpowiedzi:

220

Zakładając, że używasz Pythona 3.x:

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

Możesz uzyskać to samo zachowanie w Pythonie 2.x używając from __future__ import print_function, jak zauważył mgilson w komentarzach.

Z instrukcją print w Pythonie 2.x będziesz potrzebować jakiejś iteracji, jeśli chodzi o pytanie o print(p) for p in myListniedziałanie, możesz po prostu użyć następującego, które robi to samo i nadal jest jedną linią:

for p in myList: print p

W przypadku rozwiązania, które używa '\n'.join(), wolę listy składane i generatory, map()więc prawdopodobnie użyłbym następującego:

print '\n'.join(str(p) for p in myList) 
Andrew Clark
źródło
3
A jeśli nie, możesz from __future__ import print_functionna pythonie2.6 i nowszych.
mgilson
w Pythonie 2x użycie mapy jest nieco szybsze niż użycie złączenia na liście.
Juan Carlos Moreno
1
Dlaczego głos negatywny, czy naprawdę wynika to z różnicy prędkości między map()generatorem a? Twórca Pythona również przedkłada rozumienia i generatorymap() .
Andrew Clark,
Nie głosowałem na ciebie. Znam ten post z GVR, który był jego sposobem na powiedzenie wtedy, że przyszłe wersje Pythona nie zamierzały go zawierać, ale ostatecznie zostały.
Juan Carlos Moreno
1
Pozostali w Pythonie 3.x, ale jego uwaga w tym artykule jest taka, że [F(x) for x in S]jest to bardziej jasne niż map(F, S). Nie jest tam mowa o wydajności, ale spodziewałbym się, że różnica prędkości będzie znikoma. W każdym razie byłem zdezorientowany głosem przeciw, przepraszam, założyłem, że to ty!
Andrew Clark
28

Używam tego cały czas:

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])
lucasg
źródło
1
Aby dodać format(), zamień na str(x)ciąg formatu:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman
8

[print(a) for a in list] poda na końcu kilka typów Brak, chociaż wypisuje wszystkie elementy

ytpillai
źródło
to jest to, czego do tej pory używałem. Jest to jedna linijka, bardzo wyraźna i ekspresyjna, ale linter narzeka „Wyrażenie jest do niczego”
alete,
1
Jeśli chcesz trollować linter, możesz utworzyć osobną funkcję, która wydrukuje ją i zwróci jakąś głupią wartość i wywołaj tę funkcję w funkcji rozumienia listy
ytpillai
3

W przypadku Pythona 2. *:

Jeśli przeciążasz funkcję __str __ () dla swojej klasy Person, możesz pominąć część z mapą (str, ...). Innym sposobem na to jest utworzenie funkcji, tak jak napisałeś:

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

...

write_list(MyList)

W Pythonie 3. * jest argument sep dla funkcji print (). Zapoznaj się z dokumentacją.

gukoff
źródło
3

Rozszerzanie odpowiedzi @ lucasg (inspirowane otrzymanym komentarzem):

Aby uzyskać sformatowaną listę wyjściową, możesz wykonać następujące czynności:

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

01, 02, 05

Teraz ", "zapewnia separator (tylko między elementami, a nie na końcu), a ciąg formatujący w '02d'połączeniu z %xdaje sformatowany ciąg dla każdego elementu x- w tym przypadku sformatowany jako liczba całkowita z dwiema cyframi, wypełniona po lewej stronie zerami.

Floris
źródło
2

Aby wyświetlić każdą treść, używam:

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

Przykład użycia w funkcji:

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

Mam nadzieję, że pomogłem.

ShinyMemes
źródło
1
Uwaga: sprawdź odpowiedź powyżej. Używasz zakresu, który zapewnia wartość indeksu, i, ale używasz innej zmiennej, indexval, jako indeksu? Walczysz z prostotą Pythona. for val w my_list: print val robi to samo, co masz
BretD
1

Myślę, że jest to najwygodniejsze, jeśli chcesz tylko zobaczyć zawartość na liście:

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

Prosty, łatwy do odczytania i może być używany razem z ciągiem formatującym.

Rongzhao Zhang
źródło
1

Pytanie OP brzmi: czy istnieje coś takiego jak podążanie, jeśli nie, to dlaczego

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

odpowiedź brzmi, że istnieje, czyli:

[p for p in myList] #works perfectly

Zasadniczo używaj []do rozumienia listy i pozbądź się, printaby uniknąć drukowania None. Aby zobaczyć, dlaczego printwydruki Nonewidzą to

Gaurav Singhal
źródło
1

Niedawno stworzyłem generator haseł i chociaż jestem BARDZO NOWY w Pythonie, dodałem to jako sposób na wyświetlenie wszystkich elementów na liście (z małymi zmianami, aby dopasować je do twoich potrzeb ...

    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)

Tak jak powiedziałem, jestem BARDZO NOWY w Pythonie i jestem pewien, że jest to niezgrabny sposób dla eksperta, ale jestem tutaj dla innego przykładu

Nate Baker
źródło
0

Zakładając, że nic Ci nie jest z drukowaniem listy [1, 2, 3], prostym sposobem w Pythonie3 jest:

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

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

Uruchomienie tego daje następujący wynik:

Na tej liście lorem znajduje się 8 pozycji: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

Etalidy
źródło