Как бы вы сделали разделенную запятыми строку из списка строк? - PullRequest
416 голосов
/ 05 сентября 2008

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

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

Редактировать: мне стыдно и приятно, что решение такое простое. Очевидно, я понятия не имею, что я делаю. (Возможно, в прошлом я нуждался в «простой» конкатенации и как-то запомнил s.join([e1,e2,...]) как сокращение для s+e1+e2+....)

Ответы [ 15 ]

775 голосов
/ 05 сентября 2008
myList = ['a','b','c','d']
myString = ",".join(myList )

Это не будет работать, если список содержит числа.


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

myList = ','.join(map(str, myList)) 
63 голосов
/ 05 сентября 2008

Почему карта / лямбда-магия? Разве это не работает?

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

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

Редактировать: @ mark-biek указывает регистр для чисел. Возможно, список понимания:

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

более "питонический".

Edit2: Спасибо за предложения. Я буду использовать генератор, а не понимание списка в будущем.

>>>','.join(str(x) for x in foo)
15 голосов
/ 10 февраля 2016

",".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'
13 голосов
/ 01 октября 2008

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

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

11 голосов
/ 05 сентября 2008

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

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

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 
11 голосов
/ 05 сентября 2008

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

",".join(l)

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

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

5 голосов
/ 20 мая 2017
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

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

4 голосов
/ 05 сентября 2008

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

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
3 голосов
/ 06 сентября 2012

для преобразования списка, содержащего числа, выполните следующие действия:

string  =  ''.join([str(i) for i in list])
3 голосов
/ 15 сентября 2008
l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...