How would you make a comma-separated string from a list of strings?
517643 просмотра
15 ответа
What would be your preferred way to concatenate strings from a sequence such that between each two consecutive pair a comma is added. That is, how do you map, for instance, [ 'a', 'b', 'c' ]
to 'a,b,c'
? (The cases [ s ]
and []
should be mapped to s
and ''
, respectively.)
I usually end up using something like ''.join(map(lambda x: x+',',l))[:-1]
, but also feeling somewhat unsatisfied.
Edit: I'm both ashamed and happy that the solution is so simple. Obviously I have hardly a clue as to what I'm doing. (I probably needed "simple" concatenation in the past and somehow memorised s.join([e1,e2,...])
as a shorthand for s+e1+e2+...
.)
Ответы (15)
841 плюса
myList = ['a','b','c','d']
myString = ",".join(myList )
This won't work if the list contains numbers.
Как предложил Рикардо Рейес , если он содержит не строковые типы (такие как целые числа, числа с плавающей запятой, значения типа None), выполните:
myString = ','.join(map(str, myList))
Автор: Mark Biek
Размещён: 04.09.2008 09:06
67 плюса
Почему карта / лямбда-магия? Разве это не работает?
>>>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)
Автор: jmanning2k
Размещён: 04.09.2008 09:08
15 плюса
",".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'
Автор: Ricky
Размещён: 10.02.2016 03:43
14 плюса
Вот альтернативное решение в 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')"
ПРИМЕЧАНИЕ. Пробел после запятой является преднамеренным.
Автор: jfs Размещён: 01.10.2008 09:2311 плюса
@ Питер Хоффманн
Преимущество использования выражений генератора заключается также в создании итератора, но экономит импорт itertools. Кроме того, списочные представления обычно предпочтительнее отображения, поэтому я ожидал бы, что генераторные выражения предпочтительнее imap.
>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar'
Автор: Aaron Maenpaa
Размещён: 05.09.2008 04:29
11 плюса
Разве вы просто не хотите:
",".join(l)
Очевидно, что это становится более сложным, если вам нужно заключить в кавычки / экранировать запятые и т. Д. В значениях. В этом случае я бы предложил посмотреть модуль csv в стандартной библиотеке:
https://docs.python.org/library/csv.html
Автор: Douglas Leeder Размещён: 04.09.2008 09:095 плюса
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'
my_list
может содержать переменные любого типа. Это позволит избежать результата 'A,,,D,E'
.
4 плюса
@ jmanning2k, использующий понимание списка, имеет обратную сторону создания нового временного списка. Лучшим решением было бы использовать itertools.imap, который возвращает итератор
from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
Автор: Peter Hoffmann
Размещён: 04.09.2008 09:57
3 плюса
для преобразования списка, содержащего числа, выполните следующие действия:
string = ''.join([str(i) for i in list])
Автор: phantom
Размещён: 06.09.2012 10:08
3 плюса
l=['a', 1, 'b', 2]
print str(l)[1:-1]
Output: "'a', 1, 'b', 2"
Автор: gregrogers
Размещён: 15.09.2008 06:08
1 плюс
Если я что-то упустил, ','.join(foo)
должен делать то, что вы просите.
>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'
(редактировать: и, как указывает jmanning2k,
','.join([str(x) for x in foo])
является более безопасным и довольно Pythonic, хотя результирующая строка будет трудно проанализировать, если элементы могут содержать запятые - в этот момент вам понадобится полная мощность csv
модуля, как указывает Дуглас в своем ответе.)
1 плюс
Вот пример со списком
>>> 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
Автор: user7561216
Размещён: 15.05.2017 11:25
1 плюс
Я бы сказал, что 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.
-1 плюса
просто немного как то так :)
String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')
ring = (" , ").join(ding)
print(ring)
Вывод: однажды, после, a, время, A, долго, время, назад
Автор: Mal Размещён: 24.04.2018 08:17-2 плюса
Мои два цента. Мне нравится более простой однострочный код в 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 (спасибо).
Автор: Roberto Размещён: 07.01.2018 01:56Вопросы из категории :
- python Обработка XML в Python
- python Как я могу использовать Python itertools.groupby ()?
- python Python: На какой ОС я работаю?
- python Как я могу создать непосредственно исполняемое кроссплатформенное приложение с графическим интерфейсом на Python?
- python Вызов функции модуля с использованием его имени (строки)
- python Звук Питона («Колокол»)
- python Regex и unicode
- python Создать зашифрованный ZIP-файл в Python
- python Создайте базовый итератор Python
- python Функция транспонирования / распаковки (обратная сторона zip)?
- list How would you make a comma-separated string from a list of strings?
- list Удалить дубликаты из списка <T> в C #
- list Console.WriteLine и общий список
- list Как проверить, если список пуст?
- list Являются ли кортежи более эффективными, чем списки в Python?
- list Как отсортировать список словарей по значению словаря?
- list Сортировка совпадающих массивов в Java
- list Лучший алгоритм синхронизации двух IList в C # 2.0
- list Python List против Array - когда использовать?