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

StackOverflow https://stackoverflow.com/questions/44778

  •  09-06-2019
  •  | 
  •  

Вопрос

Какой способ объединения строк из последовательности вы предпочитаете, чтобы между каждой двумя последовательными парами добавлялась запятая.То есть, как вы сопоставляете, например, [ '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 в стандартной библиотеке:

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

>>> 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 (спасибо).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top