Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: mweerdenОтветов: 12

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

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

  • Отвечает ли это на ваш вопрос? Как объединить элементы в списке в один строка? Georgy 09.12.2020

pythonliststring

Ответы

Ответ 1 · рейтинг 1141 · Mark Biek

my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'

Это не сработает, если список содержит целые числа


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

my_string = ','.join(map(str, my_list))

Ответ 2 · рейтинг 83 · jmanning2k

Почему _1 _ / _ 2_ магия? Это не работает?

>>> foo = ['a', 'b', 'c']
>>> print(','.join(foo))
a,b,c
>>> print(','.join([]))

>>> print(','.join(['a']))
a

В случае, если в списке есть числа, вы можете использовать понимание списка:

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

или выражение генератора:

>>> ','.join(str(x) for x in foo)

Ответ 3 · рейтинг 22 · Ricky Sahu

",".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 · рейтинг 15 · jfs

Вот альтернативное решение в 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 · рейтинг 13 · Aaron Maenpaa

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

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

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

Ответ 6 · рейтинг 13 · Douglas Leeder

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

",".join(l)

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

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

Ответ 7 · рейтинг 8 · Shameem

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

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

Ответ 8 · рейтинг 5 · Peter Hoffmann

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

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

Ответ 9 · рейтинг 3 · Community

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

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

Ответ 10 · рейтинг 3 · faiz-e

Если вы хотите сделать быстрый путь :):

','.join([str(word) for word in wordList])

Но если хотите похвастаться логикой :):

wordList = ['USD', 'EUR', 'JPY', 'NZD', 'CHF', 'CAD']
stringText = ''

for word in wordList:
    stringText += word + ','

stringText = stringText[:-2]   # get rid of last comma
print(stringText)

Ответ 11 · рейтинг 1 · Ron Kalian

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

Ответ 12 · David Singer

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы