Как «правильно» распечатать список?

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 для получения дополнительной информации.
Anonymous

Ответы:

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 для каждого элемента mylist , создавая новый список строк, который затем объединяется в одну строку с помощью str.join(). Затем %оператор форматирования строки подставляет строку вместо %sin "[%s]".

SingleNegationElimination
источник
4
Спасибо, что отлично работает. Не могли бы вы подробнее объяснить, что вы делаете во второй строке? Я новичок в питоне.
Obaid
19
Он использует mapфункцию для вызова strкаждого элемента mylist, создавая новый список строк, который затем объединяет в одну строку str.join. Затем он использует %оператор форматирования строки, чтобы подставить строку вместо %sin "[%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)

Все они печатаются без кавычек, как вы и хотели.

reemer9997
источник
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)?
sandeeps
1
Меня это смущает. Фильтрует ли как-то список длинный тип данных?
dval
Более сжатая версия была быprint(end='['); print(*l, sep=', ', end=']\n')
Anonymous
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()метод с аргументом Nonefor, 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: Да, чтобы избежать удаления символов, которые на самом деле являются частью ваших данных (а не строго используются для их разграничения), естественно, потребуется немного более сложная / другая логика, если это возможно.
Мартино
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. Элементы объединяются в строку с , разделителем as.
  3. Мы используем [и ]в операторе печати, чтобы показать фигурные скобки списка.

Ссылка: .formatдля форматирования строк PEP-3101

Ани Менон
источник
Большой! Я использую .formatсамый питонический способ. Но, конечно, я принимаю разногласия. ;)
Love.by.Jesus
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]
любил.би.Иисус
источник