Як би ви створили відокремлений комою рядок зі списку рядків?


527

Який би ви кращий спосіб об'єднати рядки з послідовності, щоб між кожною двома послідовними парами додавалася кома. Тобто, як ви на мапі, наприклад, ['a', 'b', 'c']до 'a,b,c'? (Випадки ['s']і []повинні бути співставлені з 's'і '', відповідно.)

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

Відповіді:


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

Це не працюватиме, якщо список містить цілі числа


І якщо список містить непорядкові типи (такі як цілі числа, floats, bools, None), виконайте такі дії:

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

Зверніть увагу, якщо ви використовуєте python 2.7 (чого ви до цього часу не повинні), то за допомогою str виведете виняток, якщо будь-який елемент у списку має unicode.
kroiz

75

Чому map/ lambdaмагія? Це не працює?

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

18

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

У StringIOPython 3 немає
Рона Каліана

4
@RonKalian Використання from io import StringIOв Python 3
Кевін Ешкрафт

13

Ось альтернативне рішення в 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')"
    

ПРИМІТКА: Пробіл після коми є навмисним.


11

Не хочеш просто:

",".join(l)

Очевидно, що це ускладнюється, якщо вам потрібно вказати / уникнути коми тощо у значеннях. У такому випадку я б запропонував переглянути модуль csv у стандартній бібліотеці:

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


10

@ Петер Гофман

Використання генераторних виразів має перевагу також створювати ітератор, але економить імпорт itertools. Крім того, розуміння списків, як правило, вважається кращим для відображення, тому я б очікував, що вирази генератора будуть віддані перевагу зображенню.

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

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

my_listможе містити будь-який тип змінних. Це дозволяє уникнути результату 'A,,,D,E'.


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

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"

1
Я думаю, вам слід зазначити, що на відміну від інших рішень на цій сторінці, ви також цитуєте рядки.
mrdevlar

3

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

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

Це рішення не відповідає вимогам не додавати зайву кому для порожнього рядка та додавати "None" за допомогою NoneType.
Роберто

перевірити str.join роботу швидше listпорівняно з генератором
Grijesh Chauhan

3

Ось приклад зі списком

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

1
Це питання стосувалося списків, а не списків списків .
Ееро Аалтонен

@EeroAaltonen Я оновив свою відповідь, дякую за вказівку на мене праворуч.

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, як інша відповідь, тут використовується StringIOPython 2.


Але хіба це не занадто багато / складне порівняно з іншими відповідями?
Sreenikethan I

0

Якщо я чогось не пропускаю, ','.join(foo)слід робити те, що ви просите.

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

(edit: і як вказує jmanning2k,

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

є більш безпечним і досить пітонічним, хоча в результаті рядок буде важко проаналізувати, якщо елементи можуть містити коми - в цей момент вам потрібна повна потужність csvмодуля, як наголошує Дуглас у своїй відповіді.)


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

Це пітонічно, працює для рядків, чисел, None та порожнього рядка. Він короткий і відповідає вимогам. Якщо список не буде містити цифри, ми можемо використовувати цю більш просту варіацію:

>>> ','.join(ifilter(lambda x: x, l))

Також це рішення не створює нового списку, але використовує ітератор, як-от @Peter Hoffmann вказував (спасибі).


Це зайве. Прийнята відповідь - це просте, пряме і однозначно найкраще рішення. Надання надмірно складних альтернатив - безглуздо марно витрачати час. Якщо ви просто намагаєтесь ознайомитись з іншими особливостями мови, коли вже є життєздатні відповіді, ви робите те саме, що і ви проти мене.
clearlight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.