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

Каким будет ваш предпочтительный способ объединения строк из последовательности, чтобы между каждыми двумя последовательными парами добавлялась запятая. То есть, как сопоставить, например, ['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)


arrow_upward
1141
arrow_downward

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

arrow_upward
83
arrow_downward

Почему _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

arrow_upward
22
arrow_downward

",".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

arrow_upward
15
arrow_downward

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

arrow_upward
13
arrow_downward

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

Использование выражений генератора дает также преимущество создания итератора, но экономит импорт 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

arrow_upward
13
arrow_downward

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

",".join(l)

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

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

person Douglas Leeder    schedule 04.09.2008

arrow_upward
8
arrow_downward

>>> 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

arrow_upward
5
arrow_downward

@ 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

arrow_upward
3
arrow_downward

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

>>> 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

arrow_upward
3
arrow_downward

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

','.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

arrow_upward
1
arrow_downward

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

arrow_upward
0
arrow_downward

Если я чего-то не упускаю, ','.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

arrow_upward
-1
arrow_downward

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

arrow_upward

arrow_downward

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