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

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

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

Изменить: мне стыдно и счастливо, что решение так просто. Очевидно, я едва ли знаю, что я делаю. (Мне, вероятно, понадобилось "простую" конкатенацию в прошлом и как-то запомнило s.join([e1,e2,...]) как сокращение для s+e1+e2+....)

Ответ 1

myList = ['a','b','c','d']
myString = ",".join(myList )

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


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

myString = ','.join(map(str, myList)) 

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Не нужно просто:

",".join(l)

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

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

Ответ 6

@Peter Hoffmann

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

print str(l)[1:-1]

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

Ответ 10

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

string  =  ''.join([str(i) for i in list])

Ответ 11

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

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

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

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

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

Ответ 12

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

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

Ответ 13

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

Ответ 14

просто немного как то так :)

String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')

ring = (" , ").join(ding)

print(ring)

Вывод: однажды, после, a, время, A, долго, время, назад

Ответ 15

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

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

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

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