วิธี Pythonic ในการพิมพ์รายการ


114

ฉันต้องการทราบว่ามีวิธีที่ดีกว่าในการพิมพ์วัตถุทั้งหมดในรายการ Python มากกว่านี้หรือไม่:

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

ฉันอ่านวิธีนี้ไม่ดีจริงๆ:

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

ไม่มีสิ่งที่ชอบ:

print(p) for p in myList

ถ้าไม่คำถามของฉันคือ ... ทำไม? หากเราสามารถทำสิ่งประเภทนี้ด้วยรายการที่ครอบคลุมทำไมไม่เป็นคำสั่งง่ายๆนอกรายการ?


3
คุณได้รับความรู้สึกว่าการใช้for p in myList"ไม่ดีจริง" มาจากไหน?
Jon Clements


@pelotasplus: ไม่เลย :) และโดยวิธีการที่ฉันไม่ชอบเวอร์ชันแรกของฉันที่ไม่ "อ่านได้"
Guillaume Voiron

คำตอบ:


221

สมมติว่าคุณใช้ Python 3.x:

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

คุณจะได้รับพฤติกรรมเดียวกันบน Python 2.x โดยใช้from __future__ import print_functionตามที่ระบุไว้โดย mgilson ในความคิดเห็น

ด้วยคำสั่งพิมพ์บน Python 2.x คุณจะต้องทำซ้ำบางอย่างเกี่ยวกับคำถามของคุณเกี่ยวกับprint(p) for p in myListการใช้งานไม่ได้คุณสามารถใช้สิ่งต่อไปนี้ซึ่งทำสิ่งเดียวกันและยังคงเป็นบรรทัดเดียว:

for p in myList: print p

สำหรับวิธีการแก้ปัญหาที่ใช้'\n'.join()ฉันชอบรายการความเข้าใจและเครื่องกำเนิดไฟฟ้ามากกว่าmap()ดังนั้นฉันอาจใช้สิ่งต่อไปนี้:

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

3
และถ้าไม่คุณสามารถfrom __future__ import print_functionใช้ python2.6 และใหม่กว่าได้
mgilson

ใน python 2x โดยใช้แผนที่จะเร็วกว่าการใช้ join on a list comp
Juan Carlos Moreno

1
ทำไมการโหวตลดลงมันเกิดจากความแตกต่างของความเร็วmap()และเครื่องกำเนิดไฟฟ้าหรือไม่? ผู้สร้างงูใหญ่ยังเกิดขึ้นจะชอบ comprehensions map()และเครื่องกำเนิดไฟฟ้ามากกว่า
Andrew Clark

ฉันไม่ได้ลงคะแนนให้คุณ ฉันคุ้นเคยกับโพสต์นั้นจาก GVR ซึ่งเป็นวิธีการพูดของเขาในตอนนั้นว่า python ในอนาคตจะไม่รวมไว้อย่างไร แต่สุดท้ายก็ยังคงอยู่
Juan Carlos Moreno

1
พวกเขาอยู่ใน Python 3.x แต่ประเด็นของเขาในบทความนั้น[F(x) for x in S]ชัดเจนกว่าmap(F, S). ประสิทธิภาพไม่ได้ระบุไว้ที่นั่น แต่ฉันคาดว่าความแตกต่างของความเร็วจะไม่สำคัญ อย่างไรก็ตามฉันสับสนเกี่ยวกับการโหวตลงคะแนนขอโทษฉันคิดว่าเป็นคุณ!
Andrew Clark

28

ฉันใช้สิ่งนี้ตลอดเวลา:

#!/usr/bin/python

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

1
หากต้องการเพิ่มformat()ให้แทนที่str(x)ด้วยสตริงรูปแบบ:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman

8

[print(a) for a in list] จะให้กลุ่มไม่มีประเภทในตอนท้ายแม้ว่าจะพิมพ์รายการทั้งหมด


นี่คือสิ่งที่ฉันใช้มาจนถึงตอนนี้ เป็นบรรทัดเดียวชัดเจนและอธิบายได้มาก แต่มีข้อตำหนิว่า "Expression is
assign

1
หากคุณต้องการหมุนลินเตอร์คุณสามารถสร้างฟังก์ชันแยกต่างหากที่พิมพ์ออกมาและส่งคืนค่าโง่ ๆ และเรียกใช้ฟังก์ชันนั้นในรายการเพื่อความเข้าใจ
ytpillai

3

สำหรับ Python 2. *:

หากคุณโหลดฟังก์ชัน __str __ () สำหรับคลาส Person ของคุณมากเกินไปคุณสามารถละเว้นส่วนที่มี map (str, ... ) อีกวิธีหนึ่งคือการสร้างฟังก์ชันเช่นเดียวกับที่คุณเขียน:

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

...

write_list(MyList)

มีอยู่ใน Python 3 * อาร์กิวเมนต์sepสำหรับฟังก์ชัน print () ดูเอกสารประกอบ


3

คำตอบของ @ lucasg ขยาย (แรงบันดาลใจจากความคิดเห็นที่ได้รับ):

ในการรับเอาต์พุตรายการที่จัดรูปแบบคุณสามารถทำบางอย่างตามบรรทัดเหล่านี้:

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

01, 02, 05

ตอนนี้", "ให้ตัวคั่น (เฉพาะระหว่างรายการไม่ใช่ที่ส่วนท้าย) และสตริงการจัดรูปแบบ'02d'รวมกับ%xจะให้สตริงที่จัดรูปแบบสำหรับแต่ละรายการx- ในกรณีนี้จัดรูปแบบเป็นจำนวนเต็มโดยมีตัวเลขสองหลักโดยเติมด้วยศูนย์ทางซ้าย


2

ในการแสดงเนื้อหาแต่ละรายการฉันใช้:

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

ตัวอย่างการใช้งานในฟังก์ชัน:

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

หวังว่าฉันจะช่วย


1
โปรดตรวจสอบคำตอบด้านบนของคุณ คุณใช้ช่วงซึ่งให้ค่าดัชนี i แต่คุณใช้ตัวแปรอื่นค่าดัชนีเป็นดัชนีของคุณ ?? คุณกำลังต่อสู้กับความเรียบง่ายของงูหลาม สำหรับ val ใน my_list: print val ทำเช่นเดียวกับที่คุณมี
BretD

1

ฉันคิดว่านี่เป็นวิธีที่สะดวกที่สุดหากคุณต้องการดูเนื้อหาในรายการ:

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

ง่ายอ่านง่ายและสามารถใช้ร่วมกับสตริงรูปแบบ


1

คำถามของ OP คือ: มีสิ่งต่อไปนี้หรือไม่ถ้าไม่เป็นเช่นนั้นทำไม

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

คำตอบคือมีอยู่ซึ่งก็คือ:

[p for p in myList] #works perfectly

โดยทั่วไปการใช้งาน[]สำหรับรายชื่อความเข้าใจและกำจัดที่จะหลีกเลี่ยงการพิมพ์print Noneหากต้องการดูว่าทำไมprintพิมพ์ให้Noneดูสิ่งนี้


1

ฉันเพิ่งสร้างตัวสร้างรหัสผ่านและแม้ว่าฉันจะใหม่มากสำหรับ python แต่ฉันก็ทำสิ่งนี้เพื่อแสดงรายการทั้งหมดในรายการ (พร้อมการแก้ไขเล็กน้อยเพื่อให้เหมาะกับความต้องการของคุณ ...

    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)

อย่างที่ฉันพูด IM ใหม่มากสำหรับ Python และฉันแน่ใจว่านี่เป็นวิธีที่น่าเบื่อสำหรับผู้เชี่ยวชาญ แต่ฉันอยู่ที่นี่เพื่อดูตัวอย่างอื่น


0

สมมติว่าคุณสบายดีกับการพิมพ์รายการ [1,2,3] วิธีง่ายๆใน 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}")

การรันสิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้:

รายการ lorem นี้มี 8 รายการ: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.