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

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

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


person mweerden    schedule 04.09.2008    source источник
comment
Отвечает ли это на ваш вопрос? Как объединить элементы в списке в один строка?   -  person Georgy    schedule 09.12.2020


Ответы (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)) 
person Mark Biek    schedule 04.09.2008
comment
Обратите внимание, что если вы используете python 2.7 (чего сейчас не следует), то использование str вызовет исключение, если какой-либо элемент в списке имеет юникод. - person kroiz; 26.05.2020
comment
Мое требование, приведшее меня сюда, заключалось в том, чтобы заполнить предложение SQL WHERE x NOT IN (). Функция join () вставляет любую строку между элементами, но ничего не делает для каждого конца списка. Итак, это работает: nameString = '{}'. Format (',' .join (nameList)) Это одинарные кавычки, заключающие желаемые строки в двойные кавычки. Python 3.7 - person Martin Bramwell; 12.02.2021

Почему _1 _ / _ 2_ магия? Это не работает?

>>> 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)
person jmanning2k    schedule 04.09.2008

",".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'
person Ricky Sahu    schedule 10.02.2016
comment
В Python 3 нет StringIO - person Ron Kalian; 18.06.2018
comment
@RonKalian Используйте from io import StringIO в Python 3 - person Kevin Ashcraft; 19.06.2018

Вот альтернативное решение в 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')"
    

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

person jfs    schedule 01.10.2008

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

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

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

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

",".join(l)

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

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

person Douglas Leeder    schedule 04.09.2008

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

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

person Shameem    schedule 20.05.2017

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

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
person Peter Hoffmann    schedule 04.09.2008
comment
Это решение не соответствует требованиям не добавлять лишнюю запятую для пустой строки и добавлять «None» с NoneType. - person Roberto; 07.01.2018
comment
check str.join работает быстрее с list по сравнению с генератором - person Grijesh Chauhan; 07.08.2018

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

>>> 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
person Community    schedule 15.05.2017
comment
Этот вопрос касался списков, а не списков списков. - person Eero Aaltonen; 15.05.2017
comment
@EeroAaltonen Я обновил свой ответ, спасибо, что указали мне направо. - person ; 17.05.2017

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

','.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)
person faiz-e    schedule 26.06.2020

Я бы сказал, что библиотека 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.

person Ron Kalian    schedule 18.06.2018
comment
Но разве это не слишком / сложно по сравнению с другими ответами? - person Sreenikethan I; 07.11.2019

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

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

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

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

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

person David Singer    schedule 04.09.2008

Мои два цента. Мне нравится более простой однострочный код на 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 (спасибо).

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

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