Пітонічний спосіб друку списків


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"не дуже добре"?
Джон Клементс


@pelotasplus: зовсім не :) І до речі мені дуже не подобається моя перша версія, яка не "читабельна"
Гійом Войрон

Відповіді:


220

Якщо припустимо, що ви використовуєте 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 використання карти трохи швидше, ніж використання приєднання до розуміння списку.
Хуан Карлос Морено

1
Чому зворотний сигнал, це насправді пов'язано з різницею швидкостей між map()генератором і? Творець Python також має перевагу розуміння та генераторівmap() .
Ендрю Кларк

Я не проголосував за вас. Мені знайомий той пост від GVR, який тоді говорив про те, як майбутні версії python не збираються включати його, але вони врешті залишаються.
Хуан Карлос Морено

1
Вони залишилися в Python 3.x, але його суть у цій статті [F(x) for x in S]є більш зрозумілою, ніж map(F, S). Продуктивність не розглядається там, але я б очікував, що різниця швидкостей буде незначною. У всякому разі, я просто розгубився з приводу суті, вибачте, що припустив, що це ви!
Ендрю Кларк

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] в кінці дасть купу типів None, хоча він виводить усі елементи


це те, що я використовував поки що. Це один рядок, дуже чіткий і виразний, але скарги на лінійку "Вираз призначається ні до чого"
Alete

1
Якщо ви хочете запустити лінійку, ви можете зробити окрему функцію, яка роздруковує її, і повертає якесь дурне значення і викликати цю функцію в розумінні списку
ytpillai

3

Для Python 2. *:

Якщо ви перевантажите функцію __str __ () для вашого класу Person, ви можете опустити частину з картою (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
Як примітку, будь ласка, перевірте відповідь над собою. Ви використовуєте діапазон, який забезпечує значення індексу, я, але ви використовуєте іншу змінну, indexval, як свій індекс ?? Ви боретеся проти простоти пітона. для val в моєму списку: print val робить те саме, що у вас
BretD

1

Я думаю, що це найзручніше, якщо ви просто хочете побачити вміст у списку:

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

Простий, легкий для читання і може використовуватися разом із рядком формату.


1

Питання ОП: чи існує щось подібне, якщо ні, то чому

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)

Як я вже говорив, Я ДУЖЕ НОВИЙ для 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']

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.