Як "правильно" надрукувати список?


95

Тож у мене є список:

['x', 3, 'b']

І я хочу, щоб результат був:

[x, 3, b]

Як я можу це зробити в python?

Якщо я це роблю str(['x', 3, 'b']), я отримую такий із лапками, але я не хочу цитати.


Щоб пояснити, чому список не "правильно" надруковано, print(["Sam"])викликає repr("Sam"), який повертається 'Sam'(із лапками), на відміну від того, коли ви викликаєте print("Sam")та викликає python, str("Sam")який повертається Sam(без лапок). Дивіться різницю між strіrepr або Python strі lists для отримання додаткової інформації.
Анонім

Відповіді:


188

У Python 2:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

У Python 3 (де printвбудована функція, а не синтаксична функція):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

Обидва повертаються:

[x, 3, b]

Для цього використовується map()функція для виклику str для кожного елемента мого списку , створення нового списку рядків, який потім об'єднується в одну рядок str.join(). Потім %оператор форматування рядка підставляє рядок замість %sin "[%s]".


4
Дякую, це чудово працює. Чи можете ви трохи детальніше пояснити, що ви робите у другому рядку? Я новачок у python.
Обаїд,

19
Він використовує mapфункцію для виклику strкожного елемента mylist, створюючи новий список рядків, які потім об'єднує в один рядок str.join. Потім він використовує %рядок оператора форматування замінити рядок в замість %sв "[%s]".
li.davidm

6
Ще один спосіб зробити це, можливо, трохи сучасніший: "[{0}]".format(", ".join(str(i) for i in mylist))
Джек О'Коннор,

2
я прагну віддавати перевагу map(f, xs)(або imapв python2.x) над (f(x) for x in xs), коли fце заздалегідь визначений дзвінок; який має тенденцію виконувати менше байт-кодів, і, як правило, є більш компактним. Звичайно, не map(lambda x:..., xs) набагато гірше, ніж(... for x in xs)
SingleNegationElimination

1
@ user1767754: справді? Посилання?
SingleNegationElimination

18

Це простий код, тому якщо ви новачок, ви повинні зрозуміти його досить легко.

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

Він друкує їх усі без лапок, як хотілося.


15

Використання лише друку:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b

14

Якщо ви використовуєте Python3:

print('[',end='');print(*L, sep=', ', end='');print(']')

1
що тут робить print (* L)?
Сандіпс


1
Мене це бентежить. Чи довгий тип даних фільтрує список якось?
dval

Більш стислою буде версіяprint(end='['); print(*l, sep=', ', end=']\n')
Анонім

9

Замість того, щоб використовувати map, я б рекомендував використовувати вираз генератора з можливістю joinприйняти ітератор:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

Тут joinє функцією-членом класу рядків str. Вона приймає один аргумент: список (або итератор) рядків, а потім повертає новий рядок з усіма елементами зчеплених з допомогою, в цьому випадку ,.


2
Хороша оптимізація для Python 2, оскільки map повертає список у 2.x. Він повертає генератор у 3.x, тому він там не так сильно допомагає.
Tom Zych

7
Я б повернувся", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem

@eyquem: Розумник, я ще не бачив, щоб таке приєднання використовувалося раніше. Тим не менше, це трохи непрозоріше для початківця (оскільки ви використовуєте властивість, що рядок є ітерабельним контейнером односимвольних рядків).
Сет Джонсон,

6

Ви можете видалити всі небажані символи з рядка, використовуючи його translate()метод із Noneза допомогою tableаргументу, за яким слід рядок, що містить символи, які ви хочете видалити для deletecharsаргументу.

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

Якщо ви використовуєте версію Python , перш ніж 2.6, вам потрібно використовувати stringмодуль translate()функцію замість оскільки здатність передавати Noneяк tableаргумент не додано до Python 2.6. Його використання виглядає так:

import string

print string.translate(str(lst), None, "'")

Використання string.translate()функції також буде працювати у версії 2.6+, тому її використання може бути кращим.


2
На жаль: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]а також зlst = ['it isn\'t', 3, 'b']
eyquem

1
@eyquem: Так, уникнення видалення символів, які насправді є частиною ваших даних (а не строго використовуються для їх розмежування), природно, вимагатиме трохи більш докладної / іншої логіки, якщо це можливо.
martineau

3

Ось інтерактивний сеанс, який демонструє деякі кроки в одній підкладці @ TokenMacGuy. Спочатку він використовує mapфункцію для перетворення кожного елемента у списку у рядок (насправді він створює новий список, а не конвертує елементи у старому списку). Потім він використовує метод рядків, joinщоб поєднати ці рядки ', 'між собою. Решта - це просто форматування рядків, що досить просто. (Редагувати: цей екземпляр є простим; форматування рядків загалом може бути дещо складним.)

Зауважте, що використання join- це простий та ефективний спосіб створити рядок з декількох підрядків, набагато ефективніший, ніж робити це шляхом послідовного додавання рядків до рядків, що передбачає багато копіювання за лаштунками.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'

2

Використовуючи .formatдля форматування рядків,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

Вихід:

[x, 3, b]

Пояснення:

  1. mapвикористовується для зіставлення кожного елемента списку з stringтипом.
  2. Елементи об’єднані в рядок із ,розділювачем.
  3. Ми використовуємо [і ]в операторі print, щоб показати фігурні дужки списку.

Довідково: .formatдля форматування рядків PEP-3101


Чудово! Я вважаю, що використовую .formatнайбільш пітонічний спосіб. Але, звичайно, я приймаю незгоди. ;)
loved.by. Ісус

0

Мене надихнуло @AniMenon написати пітонічне більш загальне рішення.

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

Він використовує лише formatметод. Немає сліду str, і це дозволяє чітко налаштувати формат елементів. Наприклад, якщо у вас є елементи плаваючого числа як елементи списку, ви можете налаштувати їх формат, додавши специфікатор перетворення, у цьому випадку:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

Вихід цілком пристойний:

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