Каким будет ваш предпочтительный способ объединения строк из последовательности, чтобы между каждыми двумя последовательными парами добавлялась запятая. То есть как сопоставить, например, ['a', 'b', 'c'] с 'a,b,c'? (Случаи ['s'] и [] должны быть сопоставлены с 's' и '' соответственно.)
Обычно я использую что-то вроде ''.join(map(lambda x: x+',',l))[:-1], но тоже чувствую себя несколько неудовлетворенным.






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 вызовет исключение, если какой-либо элемент в списке имеет юникод.
Мое требование, приведшее меня сюда, заключалось в том, чтобы заполнить предложение SQL «WHERE x NOT IN ()». Функция join () вставляет любую строку между элементами, но ничего не делает для каждого конца списка. Так что это работает: nameString = '"{}"'. Format ('","' .join (nameList)) Это одинарные кавычки, заключающие желаемые строки в двойные кавычки. Python 3.7
Почему волшебство 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 в стандартной библиотеке:
Если я чего-то не упускаю, ','.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.
@ Питер Хоффманн
Использование выражений генератора дает также преимущество создания итератора, но экономит импорт 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"
Я думаю, вам следует указать, что, в отличие от других решений на этой странице, вы также цитируете строки.
Вот альтернативное решение в 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
@RonKalian Используйте from io import StringIO в Python 3
Вот пример со списком
>>> 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
Этот вопрос касался списков, а не списки списков.
@EeroAaltonen Я обновил свой ответ, спасибо, что указали мне направо.
>>> 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 (спасибо).
Это лишнее. Принятый ответ - простое, прямое и однозначно лучшее решение. Предоставлять слишком сложные альтернативы - бессмысленная трата времени. Если вы просто пытаетесь рассказать о других особенностях языка, когда уже есть жизнеспособные ответы, вы делаете то же самое, за что меня отвергли.
Я бы сказал, что библиотека 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.
Но разве это не слишком / сложно по сравнению с другими ответами?
Если вы хотите сделать быстрый путь :):
','.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)
Отвечает ли это на ваш вопрос? Как объединить элементы списка в одну строку?