Как бы вы сделали строку, разделенную запятыми, из списка строк?
Вопрос
Какой способ объединения строк из последовательности вы предпочитаете, чтобы между каждой двумя последовательными парами добавлялась запятая.То есть, как вы сопоставляете, например, [ 'a', 'b', 'c' ]
к 'a,b,c'
?(Случаи [ s ]
и []
должен быть сопоставлен с s
и ''
, соответственно.)
Обычно я использую что-то вроде ''.join(map(lambda x: x+',',l))[:-1]
, но также чувствую некоторую неудовлетворенность.
Редактировать:Мне одновременно стыдно и радостно, что решение такое простое.Очевидно, я почти не имею ни малейшего представления о том, что делаю.(Наверное, мне раньше нужна была «простая» конкатенация, и я как-то запомнил s.join([e1,e2,...])
как сокращение для s+e1+e2+...
.)
Решение
myList = ['a','b','c','d']
myString = ",".join(myList )
Это не сработает, если список содержит числа.
Как Рикардо Рейес рекомендуется, если он содержит нестроковые типы (например, целые числа, числа с плавающей запятой, логические значения, None), тогда выполните:
myList = ','.join(map(str, myList))
Другие советы
Почему магия карты/лямбда?Разве это не работает?
>>>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])
является более «питоническим».
Редактировать2:Спасибо за предложения.В будущем я буду использовать генератор, а не понимание списка.
>>>','.join(str(x) for x in foo)
",".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.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')"
ПРИМЕЧАНИЕ:Пробел после запятой введен намеренно.
@Питер Хоффманн
Преимущество использования выражений-генераторов заключается в том, что они также создают итератор, но при этом экономят импорт инструментов itertools.Более того, понимание списков обычно предпочтительнее сопоставления, поэтому я ожидаю, что выражения генератора будут предпочтительнее imap.
>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar'
Разве вы не хотите просто:
",".join(l)
Очевидно, что все становится сложнее, если вам нужно заключать в кавычки/экранировать запятые и т. д. в значениях.В этом случае я бы предложил посмотреть модуль csv в стандартной библиотеке:
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'
my_list
может содержать переменные любого типа.Это позволит избежать результата 'A,,,D,E'
.
@jmanning2k с использованием понимания списка имеет недостаток, связанный с созданием нового временного списка.Лучшим решением было бы использовать itertools.imap, который возвращает итератор.
from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
для преобразования списка, содержащего числа, выполните следующие действия:
string = ''.join([str(i) for i in list])
l=['a', 1, 'b', 2]
print str(l)[1:-1]
Output: "'a', 1, 'b', 2"
Если я ничего не упускаю, ','.join(foo)
должен сделать то, о чем вы просите.
>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'
(редактировать:и, как указывает jmanning2k,
','.join([str(x) for x in foo])
более безопасный и вполне питонический, хотя результирующую строку будет сложно разобрать, если элементы могут содержать запятые — в этот момент вам понадобятся все возможности csv
модуль, как указывает Дуглас в своем ответе.)
Вот пример со списком
>>> 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
Я бы сказал, 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
это Питон 2.
просто что-то в этом роде :)
String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')
ring = (" , ").join(ding)
print(ring)
Выход:Однажды, Когда-то, Время, А, Давно, Время, Назад
Мои два цента.Мне нравится более простой однострочный код на 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 (спасибо).