Cara pythonic untuk mencetak item daftar

114

Saya ingin tahu apakah ada cara yang lebih baik untuk mencetak semua objek dalam daftar Python daripada ini:

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

Saya membaca cara ini tidak terlalu baik:

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

Bukankah ada sesuatu seperti:

print(p) for p in myList

Jika tidak, pertanyaan saya adalah ... mengapa? Jika kita dapat melakukan hal-hal semacam ini dengan daftar yang lengkap, mengapa tidak sebagai pernyataan sederhana di luar daftar?

Guillaume Voiron
sumber
3
Dari mana Anda mendapat kesan bahwa penggunaan for p in myListitu "tidak terlalu bagus"?
Jon Clements
@JonClements: chrisarndt.de/talks/rupy/2008/output/slides.html
Guillaume Voiron
@pelotasplus: tidak sama sekali :) Dan omong-omong, saya tidak terlalu suka versi pertama saya yang tidak "dapat dibaca"
Guillaume Voiron

Jawaban:

220

Dengan asumsi Anda menggunakan Python 3.x:

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

Anda bisa mendapatkan perilaku yang sama pada Python 2.x menggunakan from __future__ import print_function, seperti yang dicatat oleh mgilson di komentar.

Dengan pernyataan cetak pada Python 2.x Anda akan memerlukan beberapa jenis iterasi, mengenai pertanyaan Anda tentang print(p) for p in myListtidak berfungsi, Anda bisa menggunakan yang berikut ini yang melakukan hal yang sama dan masih satu baris:

for p in myList: print p

Untuk solusi yang menggunakan '\n'.join(), saya lebih suka pemahaman daftar dan generator, map()jadi saya mungkin akan menggunakan yang berikut:

print '\n'.join(str(p) for p in myList) 
Andrew Clark
sumber
3
Dan jika tidak, Anda bisa from __future__ import print_functionmenggunakan python2.6 dan yang lebih baru.
mgilson
di python 2x menggunakan map sedikit lebih cepat daripada menggunakan join pada pemahaman daftar.
Juan Carlos Moreno
1
Mengapa downvote, apakah itu benar-benar karena perbedaan kecepatan antara map()dan generator? Pencipta Python juga lebih menyukai pemahaman dan generator daripadamap() .
Andrew Clark
Aku tidak memilihmu. Saya akrab dengan posting dari GVR yang merupakan cara dia mengatakan, saat itu, bagaimana versi python di masa depan tidak akan memasukkannya tetapi, mereka akhirnya tetap tinggal.
Juan Carlos Moreno
1
Mereka tetap menggunakan Python 3.x, tetapi maksudnya dalam artikel itu [F(x) for x in S]adalah lebih jelas daripada map(F, S). Performa tidak dibahas di sana, tetapi saya berharap perbedaan kecepatan dapat diabaikan. Pokoknya saya baru bingung downvote nya, maaf saya anggap itu kamu!
Andrew Clark
28

Saya menggunakan ini sepanjang waktu :

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])
lucasg
sumber
1
Untuk menambahkan format(), ganti str(x)dengan string format:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman
8

[print(a) for a in list] akan memberikan banyak tipe None di bagian akhir meskipun mencetak semua item

ytpillai
sumber
inilah yang selama ini saya gunakan. Itu satu baris, sangat jelas dan ekspresif, tetapi keluhan ringan "Ekspresi tidak ditugaskan"
alete
1
Jika Anda ingin mengendalikan linter, Anda dapat membuat fungsi terpisah yang mencetaknya dan mengembalikan beberapa nilai bodoh dan memanggil fungsi itu dalam pemahaman daftar
ytpillai
3

Untuk Python 2. *:

Jika Anda membebani fungsi __str __ () untuk kelas Person Anda, Anda dapat menghilangkan bagian tersebut dengan map (str, ...). Cara lain untuk ini adalah membuat fungsi, seperti yang Anda tulis:

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

...

write_list(MyList)

Ada di Python 3. * argumen sep untuk fungsi print (). Lihat dokumentasi.

gukoff
sumber
3

Memperluas jawaban @ lucasg (terinspirasi oleh komentar yang diterimanya):

Untuk mendapatkan keluaran daftar yang diformat , Anda dapat melakukan sesuatu di sepanjang baris ini:

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

01, 02, 05

Sekarang ", "menyediakan pemisah (hanya antara item, bukan di akhir) dan string pemformatan yang '02d'digabungkan dengan %xmemberikan string yang diformat untuk setiap item x- dalam hal ini, diformat sebagai bilangan bulat dengan dua digit, kiri diisi dengan nol.

Floris
sumber
2

Untuk menampilkan setiap konten, saya menggunakan:

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

Contoh penggunaan dalam suatu fungsi:

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

Semoga saya membantu.

ShinyMemes
sumber
1
Sekadar catatan, silakan cek jawaban di atas Anda. Anda menggunakan rentang, yang memberikan nilai indeks, i, namun Anda menggunakan variabel lain, indexval, sebagai indeks Anda ?? Anda berjuang melawan kesederhanaan python. untuk val di my_list: print val melakukan hal yang sama seperti yang Anda miliki
BretD
1

Saya rasa ini yang paling nyaman jika Anda hanya ingin melihat konten di daftar:

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

Sederhana, mudah dibaca dan dapat digunakan bersama dengan format string.

Rongzhao Zhang
sumber
1

Pertanyaan OP adalah: apakah ada hal seperti berikut, jika tidak maka mengapa

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

jawabannya adalah, itu memang ada yaitu:

[p for p in myList] #works perfectly

Pada dasarnya, gunakan []untuk pemahaman daftar dan hapus printuntuk menghindari pencetakan None. Untuk melihat mengapa printcetakan Nonelihat ini

Gaurav Singhal
sumber
1

Saya baru-baru ini membuat pembuat kata sandi dan meskipun saya SANGAT BARU mengenal python, saya membuat ini sebagai cara untuk menampilkan semua item dalam daftar (dengan pengeditan kecil agar sesuai dengan kebutuhan Anda ...

    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)

Seperti yang saya katakan, saya SANGAT BARU untuk Python dan saya yakin ini cara yang kikuk bagi seorang ahli, tapi saya hanya di sini untuk contoh lain

Nate Baker
sumber
0

Dengan asumsi Anda baik-baik saja dengan daftar Anda yang dicetak [1,2,3], maka cara mudah dengan Python3 adalah:

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

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

Menjalankan ini menghasilkan keluaran berikut:

Ada 8 item dalam daftar lorem ini: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

Aethalides
sumber