Cách Pythonic để in các mục trong danh sách


114

Tôi muốn biết liệu có cách nào tốt hơn để in tất cả các đối tượng trong danh sách Python hơn cách này:

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

Tôi đọc theo cách này không thực sự tốt:

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

Không có cái gì đó như:

print(p) for p in myList

Nếu không, câu hỏi của tôi là ... tại sao? Nếu chúng ta có thể thực hiện loại công việc này với danh sách toàn diện, tại sao không phải là một câu lệnh đơn giản bên ngoài danh sách?


3
Do đâu mà bạn có ấn tượng rằng việc sử dụng for p in myListlà "không thực sự tốt"?
Jon Clements


@pelotasplus: không hề :) Và nhân tiện tôi không thực sự thích phiên bản đầu tiên của mình không "đọc được"
Guillaume Voiron

Câu trả lời:


220

Giả sử bạn đang sử dụng Python 3.x:

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

Bạn có thể nhận được hành vi tương tự trên Python 2.x bằng cách sử dụng from __future__ import print_function, như mgilson đã lưu ý trong các nhận xét.

Với câu lệnh in trên Python 2.x, bạn sẽ cần lặp lại một số loại, liên quan đến câu hỏi của bạn về việc print(p) for p in myListkhông hoạt động, bạn chỉ có thể sử dụng câu lệnh sau đây thực hiện điều tương tự và vẫn là một dòng:

for p in myList: print p

Đối với một giải pháp sử dụng '\n'.join(), tôi thích phần hiểu danh sách và trình tạo hơn map()vì vậy tôi có thể sẽ sử dụng những thứ sau:

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

3
Và nếu không, bạn có thể from __future__ import print_functiontrên python2.6 và mới hơn.
mgilson

trong python 2x bằng cách sử dụng bản đồ nhanh hơn một chút so với việc sử dụng phép nối trên việc hiểu danh sách.
Juan Carlos Moreno

1
Tại sao lại giảm tốc, có thực sự là do sự khác biệt về tốc độ giữa map()máy phát điện và máy phát điện không? Người tạo ra Python cũng thích phần hiểu và trình tạo hơnmap() .
Andrew Clark

Tôi đã không bỏ phiếu cho bạn. Tôi quen thuộc với bài đăng đó từ GVR, đó là cách nói của anh ấy, hồi đó, các phiên bản python trong tương lai sẽ không bao gồm nó như thế nào nhưng cuối cùng chúng vẫn ở lại.
Juan Carlos Moreno

1
Họ đã ở trong Python 3.x, nhưng quan điểm của anh ấy trong bài viết đó [F(x) for x in S]là rõ ràng hơn map(F, S). Hiệu suất không được đề cập ở đó, nhưng tôi hy vọng sự khác biệt về tốc độ là không đáng kể. Dù sao tôi chỉ nhầm lẫn về downvote, xin lỗi tôi đã cho rằng đó là bạn!
Andrew Clark

28

Tôi sử dụng tất cả các thời gian :

#!/usr/bin/python

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

1
Để thêm format(), hãy thay thế str(x)bằng một chuỗi định dạng:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman

8

[print(a) for a in list] sẽ cung cấp một loạt các loại Không có ở cuối mặc dù nó in ra tất cả các mục


đây là những gì tôi đã sử dụng cho đến nay. Đó là một dòng, rất rõ ràng và dễ hiểu, nhưng những lời phàn nàn của người nhỏ "Biểu thức được gán cho không có gì"
alete

1
Nếu bạn muốn troll các Linter, bạn có thể thực hiện một chức năng riêng biệt mà in nó ra và trả về một số giá trị ngu ngốc và cuộc gọi mà chức năng trong danh sách hiểu
ytpillai

3

Đối với Python 2. *:

Nếu bạn quá tải hàm __str __ () cho lớp Người của mình, bạn có thể bỏ qua phần có bản đồ (str, ...). Một cách khác cho việc này là tạo một hàm, giống như bạn đã viết:

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

...

write_list(MyList)

Có trong Python 3. * đối số sep cho hàm print (). Hãy xem tài liệu.


3

Mở rộng câu trả lời của @ lucasg (lấy cảm hứng từ nhận xét mà nó nhận được):

Để có được đầu ra danh sách được định dạng , bạn có thể làm điều gì đó dọc theo những dòng sau:

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

01, 02, 05

Bây giờ, ", "cung cấp dấu phân tách (chỉ giữa các mục, không phải ở cuối) và chuỗi định dạng được '02d'kết hợp với %xtạo ra một chuỗi được định dạng cho mỗi mục x- trong trường hợp này, được định dạng là một số nguyên có hai chữ số, được điền bên trái bằng các số không.


2

Để hiển thị từng nội dung, tôi sử dụng:

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

Ví dụ về cách sử dụng trong một hàm:

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

Hy vọng tôi đã giúp.


1
Chỉ là một lưu ý, vui lòng kiểm tra câu trả lời ở trên bạn. Bạn sử dụng một phạm vi, cung cấp giá trị chỉ mục, i, nhưng bạn sử dụng một biến khác, indexval, làm chỉ mục của mình ?? Bạn đang chiến đấu chống lại sự đơn giản của python. cho val trong my_list: in val không giống như những gì bạn có
BretD

1

Tôi nghĩ đây là cách thuận tiện nhất nếu bạn chỉ muốn xem nội dung trong danh sách:

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

Đơn giản, dễ đọc và có thể được sử dụng cùng với chuỗi định dạng.


1

Câu hỏi của OP là: có tồn tại những thứ như sau không, nếu không thì tại sao

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

câu trả lời là, nó tồn tại là:

[p for p in myList] #works perfectly

Về cơ bản, sử dụng []để hiểu danh sách và loại bỏ printviệc tránh in None. Để xem tại sao printbản in Nonehãy xem điều này


1

Gần đây tôi đã tạo một trình tạo mật khẩu và mặc dù tôi RẤT MỚI sử dụng python, nhưng tôi đã sử dụng nó như một cách để hiển thị tất cả các mục trong danh sách (với các chỉnh sửa nhỏ để phù hợp với nhu cầu của bạn ...

    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)

Như tôi đã nói, IM RẤT MỚI đối với Python và tôi chắc chắn rằng đây là cách để làm quen với một chuyên gia, nhưng tôi chỉ ở đây để xem một ví dụ khác


0

Giả sử bạn ổn với việc danh sách của mình được in [1,2,3], thì một cách dễ dàng trong Python3 là:

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

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

Chạy điều này sẽ tạo ra kết quả sau:

Có 8 mục trong danh sách lorem này: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.