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.