Питонический способ печати элементов списка

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«не очень хорошее»?
Джон Клементс
@JonClements: chrisarndt.de/talks/rupy/2008/output/slides.html
Гийом Вуарон
@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_functionpython2.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])
lucasg
источник
1
Чтобы добавить format(), замените str(x)print " ".join(["{:02d}".format(x) for x in l])
символ
8

[print(a) for a in list] даст кучу типов None в конце, хотя распечатает все элементы

ytpillai
источник
это то, что я использовал до сих пор. Это одна строчка, очень четкая и выразительная, но жалобы на линтер: «Выражение ни к чему не приписывается»
alete
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 (). Взгляните на документацию.

gukoff
источник
3

Расширение ответа @lucasg (на основе полученного комментария):

Чтобы получить форматированный вывод списка, вы можете сделать что-нибудь в этом роде:

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

01, 02, 05

Теперь ", "предоставляет разделитель (только между элементами, а не в конце), а строка форматирования, '02d'объединенная с, %xдает отформатированную строку для каждого элемента x- в данном случае отформатированную как целое число с двумя цифрами, заполненными нулями слева.

Floris
источник
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.')

Надеюсь, я помог.

ShinyMemes
источник
1
В качестве примечания, пожалуйста, проверьте ответ над вами. Вы используете диапазон, который предоставляет значение индекса i, но в качестве индекса используете другую переменную indexval ?? Вы боретесь с простотой питона. for 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)

Как я уже сказал, Я ОЧЕНЬ НОВИНКА в 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}")

Выполнение этого дает следующий результат:

В этом списке лорм 8 пунктов: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

эфалид
источник