Liste öğelerini yazdırmanın Pythonic yolu


114

Bir Python listesindeki tüm nesneleri yazdırmanın bundan daha iyi bir yolu olup olmadığını bilmek isterim:

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

Bu şekilde okudum gerçekten iyi değil:

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

Gibi bir şey yok mu:

print(p) for p in myList

Değilse, sorum şu ... neden? Bu tür şeyleri kapsamlı listelerle yapabilirsek, neden liste dışında basit bir ifade olarak olmasın?


3
Kullanmanın for p in myList"gerçekten iyi olmadığı" izlenimini nereden edindiniz ?
Jon Clements


@pelotasplus: hiç de değil :) Ve bu arada, "okunabilir" olmayan ilk versiyonumu gerçekten beğenmiyorum
Guillaume Voiron 21

Yanıtlar:


220

Python 3.x kullandığınızı varsayarsak:

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

from __future__ import print_functionMgilson'un yorumlarda belirttiği gibi , Python 2.x'te de aynı davranışı elde edebilirsiniz .

Python 2.x'teki print deyimiyle, print(p) for p in myListçalışmama hakkındaki sorunuzla ilgili bir tür yinelemeye ihtiyacınız olacak, yalnızca aynı şeyi yapan ve hala tek satır olan aşağıdakileri kullanabilirsiniz:

for p in myList: print p

Kullanılan bir çözüm için '\n'.join(), liste anlamalarını ve oluşturucuları tercih ederim, map()bu yüzden muhtemelen aşağıdakileri kullanırdım:

print '\n'.join(str(p) for p in myList) 

3
Ve değilse from __future__ import print_function, python2.6 ve daha yeni sürümlerde yapabilirsiniz.
mgilson

python 2x'te haritayı kullanmak, liste kavrayışında birleştirme kullanmaktan biraz daha hızlıdır.
Juan Carlos Moreno

1
Neden olumsuz oy, gerçekten map()bir jeneratör ile arasındaki hız farkından mı kaynaklanıyor? Python'un yaratıcısı aynı zamanda anlayışları ve oluşturucuları tercih edermap() .
Andrew Clark

Sana oy vermedim. GVR'den gelen ve o zamanlar python'un gelecekteki sürümlerinin onu nasıl dahil etmeyeceğini söyleme yolu olan bu gönderiye aşinayım, ancak kalmayı başardılar.
Juan Carlos Moreno

1
Python 3.x'te kaldılar, ancak bu makaledeki amacı bundan [F(x) for x in S]daha açık map(F, S). Performans burada ele alınmıyor, ancak hız farkının ihmal edilebilir olmasını bekliyorum. Her neyse, olumsuz oy konusunda kafam karıştı, özür dilerim, sen olduğunu sandım!
Andrew Clark

28

Bunu her zaman kullanıyorum:

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])

1
Eklemek format()için str(x), bir biçim dizesiyle değiştirin :print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman

8

[print(a) for a in list] tüm öğeleri yazdırmasına rağmen sonunda bir grup Yok türü verecek


bu şimdiye kadar kullandığım şey. Tek satır, çok açık ve açıklayıcı, ancak linter şikayetleri "İfade hiçbir şeye atanmadı"
2019


3

Python 2. * için:

Person sınıfınız için __str __ () fonksiyonunu aşırı yüklerseniz, map (str, ...) ile parçayı atlayabilirsiniz. Bunun bir başka yolu da, yazdığınız gibi bir işlev oluşturmaktır:

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

...

write_list(MyList)

Python 3'te * print () işlevi için sep argümanı vardır . Belgelere bir göz atın.


3

@ Lucasg'ın yanıtını genişletme (aldığı yorumdan esinlenerek):

Biçimlendirilmiş bir liste çıktısı almak için şu satırlar boyunca bir şeyler yapabilirsiniz:

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

01, 02, 05

Şimdi ", "ayırıcı sağlar (yalnızca öğeler arasında değil, sonunda) ve biçimlendirme dize '02d'ile kombine %xher öğe için bir biçimlendirilmiş dize verir x- bu durumda, iki basamaklı bir tamsayı olarak biçimlendirilmiş, sıfırlarla sol doldurdu.


2

Her bir içeriği görüntülemek için şunu kullanıyorum:

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

Bir işlevde kullanma örneği:

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

Umarım yardım etmişimdir.


1
Bir not olarak, lütfen üstünüzdeki cevabı kontrol edin. Bir dizin değeri sağlayan bir aralık kullanıyorsunuz, i, yine de dizininiz olarak başka bir değişken, indexval kullanıyorsunuz? Python'un basitliğine karşı savaşıyorsunuz. my_list içindeki val için: print val sahip olduklarınızla aynı şeyi yapar
BretD

1

Listedeki içeriği sadece görmek istiyorsanız bunun en uygun olduğunu düşünüyorum:

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

Basit, okunması kolay ve biçim dizesi ile birlikte kullanılabilir.


1

OP'nin sorusu şudur: aşağıdaki gibi bir şey var mı, değilse neden

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

cevap şu ki var olan:

[p for p in myList] #works perfectly

Temel olarak, []listeyi anlamak için kullanın ve printyazdırmaktan kaçınmaktan kurtulun None. Nedenini görmek için printbaskılar Nonebkz bu


1

Yakın zamanda bir şifre oluşturucu yaptım ve python için ÇOK YENİ olsam da, bunu bir listedeki tüm öğeleri göstermenin bir yolu olarak kırbaçladım (ihtiyaçlarınıza uyacak küçük düzenlemelerle ...

    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)

Dediğim gibi, Python için ÇOK YENİ IM ve eminim bu bir uzman için hantaldır, ama ben sadece başka bir örnek için buradayım


0

Listenizin yazdırılmasında sorun olmadığını varsayarsak [1,2,3], Python3'ün kolay bir yolu şudur:

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

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

Bunu çalıştırmak aşağıdaki çıktıyı üretir:

Bu lorem listesinde 8 öğe vardır: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.