Как бы вы сделали строку, разделенную запятыми, из списка строк?

Каким будет ваш предпочтительный способ объединения строк из последовательности, чтобы между каждыми двумя последовательными парами добавлялась запятая. То есть как сопоставить, например, ['a', 'b', 'c'] с 'a,b,c'? (Случаи ['s'] и [] должны быть сопоставлены с 's' и '' соответственно.)

Обычно я использую что-то вроде ''.join(map(lambda x: x+',',l))[:-1], но тоже чувствую себя несколько неудовлетворенным.

Отвечает ли это на ваш вопрос? Как объединить элементы списка в одну строку?

Georgy 09.12.2020 15:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
593
1
692 795
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Ответ принят как подходящий

my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'

Это не сработает, если список содержит целые числа


И если список содержит нестроковые типы (такие как целые числа, числа с плавающей запятой, bools, None), выполните:

my_string = ','.join(map(str, my_list)) 

Обратите внимание, если вы используете python 2.7 (чего сейчас не следует), то использование str вызовет исключение, если какой-либо элемент в списке имеет юникод.

kroiz 26.05.2020 16:54

Мое требование, приведшее меня сюда, заключалось в том, чтобы заполнить предложение SQL «WHERE x NOT IN ()». Функция join () вставляет любую строку между элементами, но ничего не делает для каждого конца списка. Так что это работает: nameString = '"{}"'. Format ('","' .join (nameList)) Это одинарные кавычки, заключающие желаемые строки в двойные кавычки. Python 3.7

Martin Bramwell 12.02.2021 14:25

Почему волшебство map / lambda? Это не работает?

>>> foo = ['a', 'b', 'c']
>>> print(','.join(foo))
a,b,c
>>> print(','.join([]))

>>> print(','.join(['a']))
a

В случае, если в списке есть числа, вы можете использовать понимание списка:

>>> ','.join([str(x) for x in foo])

или выражение генератора:

>>> ','.join(str(x) for x in foo)

Разве вы просто не хотите:

",".join(l)

Очевидно, что становится сложнее, если вам нужно заключить в кавычки / экранировать запятые и т. д. В значениях. В этом случае я бы посоветовал взглянуть на модуль csv в стандартной библиотеке:

https://docs.python.org/library/csv.html

Если я чего-то не упускаю, ','.join(foo) должен делать то, о чем вы просите.

>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'

(изменить: и, как указывает jmanning2k,

','.join([str(x) for x in foo])

является более безопасным и довольно Pythonic, хотя результирующую строку будет сложно проанализировать, если элементы могут содержать запятые - в этот момент вам понадобится полная мощность модуля csv, как указывает Дуглас в своем ответе.)

@ jmanning2k с использованием понимания списка имеет обратную сторону создания нового временного списка. Лучшим решением было бы использовать itertools.imap, который возвращает итератор

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))

Это решение не соответствует требованиям не добавлять лишнюю запятую для пустой строки и добавлять «None» с NoneType.

Roberto 07.01.2018 16:27
проверитьstr.join work faster with list in comparison to generator
Grijesh Chauhan 07.08.2018 12:19

@ Питер Хоффманн

Использование выражений генератора дает также преимущество создания итератора, но экономит импорт itertools. Кроме того, понимание списков обычно предпочтительнее отображать, поэтому я бы ожидал, что выражения генератора предпочтительнее imap.

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 

l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"

Я думаю, вам следует указать, что, в отличие от других решений на этой странице, вы также цитируете строки.

mrdevlar 23.02.2018 17:05

Вот альтернативное решение в Python 3.0, которое позволяет использовать элементы списка, не являющиеся строками:

>>> alist = ['a', 1, (2, 'b')]
  • стандартный способ

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
    
  • альтернативное решение

    >>> import io
    >>> s = io.StringIO()
    >>> print(*alist, file=s, sep=', ', end='')
    >>> s.getvalue()
    "a, 1, (2, 'b')"
    

ПРИМЕЧАНИЕ. Пробел после запятой является намеренным.

",".join(l) подойдет не для всех случаев. Я бы предложил использовать модуль csv с StringIO

import StringIO
import csv

l = ['list','of','["""crazy"quotes"and\'',123,'other things']

line = StringIO.StringIO()
writer = csv.writer(line)
writer.writerow(l)
csvcontent = line.getvalue()
# 'list,of,"[""""""crazy""quotes""and\'",123,other things\r\n'

В Python 3 нет StringIO

Ron Kalian 18.06.2018 18:02

@RonKalian Используйте from io import StringIO в Python 3

Kevin Ashcraft 19.06.2018 03:37

Вот пример со списком

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

Более точным:-

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

Пример 2: -

myList = ['Apple','Orange']
myList = ','.join(map(str, myList)) 
print "Output:", myList
Output: Apple,Orange

Этот вопрос касался списков, а не списки списков.

Eero Aaltonen 15.05.2017 14:29

@EeroAaltonen Я обновил свой ответ, спасибо, что указали мне направо.

user7561216 17.05.2017 06:19

>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

my_list может содержать переменные любого типа. Это позволит избежать результата 'A,,,D,E'.

Мои два цента. Мне нравится более простой однострочный код на Python:

>>> from itertools import imap, ifilter
>>> l = ['a', '', 'b', 1, None]
>>> ','.join(imap(str, ifilter(lambda x: x, l)))
a,b,1
>>> m = ['a', '', None]
>>> ','.join(imap(str, ifilter(lambda x: x, m)))
'a'

Он питонический, работает со строками, числами, None и пустой строкой. Он короткий и удовлетворяет требованиям. Если список не будет содержать чисел, мы можем использовать этот более простой вариант:

>>> ','.join(ifilter(lambda x: x, l))

Также это решение не создает новый список, но использует итератор, например, @Peter Hoffmann (спасибо).

Это лишнее. Принятый ответ - простое, прямое и однозначно лучшее решение. Предоставлять слишком сложные альтернативы - бессмысленная трата времени. Если вы просто пытаетесь рассказать о других особенностях языка, когда уже есть жизнеспособные ответы, вы делаете то же самое, за что меня отвергли.

clearlight 25.02.2018 18:24

Я бы сказал, что библиотека csv - единственный разумный вариант здесь, поскольку она была создана для работы со всеми вариантами использования csv, такими как запятые в строке и т. д.

Чтобы вывести список l в файл .csv:

import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(l)  # this will output l as a single row.  

Также можно использовать writer.writerows(iterable) для вывода нескольких строк в CSV.

Этот пример совместим с Python 3, поскольку в другом ответе здесь используется StringIO, который является Python 2.

Но разве это не слишком / сложно по сравнению с другими ответами?

Sreenikethan I 07.11.2019 19:17

Если вы хотите сделать быстрый путь :):

','.join([str(word) for word in wordList])

Но если хотите похвастаться логикой :):

wordList = ['USD', 'EUR', 'JPY', 'NZD', 'CHF', 'CAD']
stringText = ''

for word in wordList:
    stringText += word + ','

stringText = stringText[:-2]   # get rid of last comma
print(stringText)

Другие вопросы по теме