7

Как создать строку с разделением запятой из списка строк?

1

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

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

5 ответ(ов)

13

Если у вас есть список, например, my_list = ['a', 'b', 'c', 'd'], вы можете преобразовать его в строку, используя метод join:

my_string = ','.join(my_list)

В результате вы получите строку:

'a,b,c,d'

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

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

Таким образом, даже если в списке есть такие типы данных, как целые числа, дробные числа, булевы значения или None, код будет работать корректно.

0

Ваш вопрос о том, почему используются map/lambda, и если это действительно нужно, вполне уместен. Давайте рассмотрим приведенные вами примеры:

  1. Вы привели пример с join:
foo = ['a', 'b', 'c']
print(','.join(foo))  # выводит: a,b,c
print(','.join([]))    # ничего не выводит
print(','.join(['a'])) # выводит: a

Этот код работает абсолютно корректно. Метод join просто соединяет элементы списка строк, используя запятую в качестве разделителя. Если список пустой, результат будет пустой строкой.

  1. В случае, если у вас есть числа в списке, вы правильно отметили, что требуется преобразовать их в строки, прежде чем вы сможете их соединить:
', '.join([str(x) for x in foo])

или с помощью генераторного выражения:

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

Оба подхода будут работать. Однако использование map/lambda также может быть подходящим решением, так как оно может сделать код более лаконичным:

', '.join(map(str, foo))

Почему map/lambda?

Использование map вместе с lambda или просто map для применения функции ко всем элементам списка может быть полезно в ситуациях, когда:

  • Вы хотите избавиться от явного создания списка (например, чтобы избежать затрат на создание временной структуры данных).
  • Код становится более читаемым и декомпозированным, особенно при более сложных преобразованиях.

На самом деле, выбор подхода может зависеть от вашей личной предпочтений или стиля кодирования, который вы используете в проекте.

0

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

Этот подход обеспечит корректное экранирование символов, таких как кавычки и запятые, что критически важно для формирования правильного CSV-формата.

0

Использование генераторов имеет преимущество в том, что они возвращают итератор, но при этом не требует импорта модуля itertools. Кроме того, списковые включения (list comprehensions) в общем случае предпочтительнее функции map, поэтому я ожидаю, что генераторы будут предпочтительнее imap.

Пример:

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

В этом примере мы используем генераторное выражение для преобразования каждого элемента списка в строку, а затем объединяем их в одну строку, разделяя запятыми.

0

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

ПРИМЕЧАНИЕ: Пробел после запятой является намеренным.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь