How would you make a comma-separated string from a list of strings?

python list

517643 просмотра

15 ответа

8223 Репутация автора

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

Автор: mweerden Источник Размещён: 04.09.2008 09:04

Ответы (15)


841 плюса

98145 Репутация автора

Решение
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 плюса

7956 Репутация автора

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

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

11 плюса

45509 Репутация автора

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

",".join(l)

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

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

Автор: Douglas Leeder Размещён: 04.09.2008 09:09

1 плюс

942 Репутация автора

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

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

(редактировать: и, как указывает jmanning2k,

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

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

Автор: David Singer Размещён: 04.09.2008 09:10

4 плюса

38044 Репутация автора

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

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
Автор: Peter Hoffmann Размещён: 04.09.2008 09:57

11 плюса

85318 Репутация автора

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

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

3 плюса

0 Репутация автора

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

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"
Автор: gregrogers Размещён: 15.09.2008 06:08

14 плюса

290141 Репутация автора

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

3 плюса

47 Репутация автора

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

string  =  ''.join([str(i) for i in list])
Автор: phantom Размещён: 06.09.2012 10:08

15 плюса

16672 Репутация автора

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

1 плюс

0 Репутация автора

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

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

5 плюса

1281 Репутация автора

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

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

Автор: Shameem Размещён: 20.05.2017 11:31

-2 плюса

188 Репутация автора

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

-1 плюса

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

1 плюс

1280 Репутация автора

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

Автор: Ron Kalian Размещён: 18.06.2018 03:08
Вопросы из категории :
32x32