2008-09-04 2 views
288

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

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

Редактировать: Я оба стыжусь и счастлив, что решение так просто. Очевидно, я едва ли знаю, что я делаю. (Я, вероятно, нужен «простой» конкатенацию в прошлом, и как-то запомнил s.join([e1,e2,...]) как стенография для s+e1+e2+....)

ответ

550
myList = ['a','b','c','d'] 
myString = ",".join(myList) 

Это не будет работать, если список содержит номера.


Как Ricardo Reyes предложил, если он содержит типы нестроковой (такие как целые числа, поплавки, Bools, None), то сделать:

myList = ','.join(map(str, myList)) 
+69

Вы правы, это не сработает, если список содержит цифры, но так оно и будет: myList = ','. Join (map (str, myList)) – 2008-09-15 18:45:29

+0

Ах, отлично! Я буду использовать map() в будущем. Я всегда делал: myString = ",". Join ([str (x) для x в myList]) – 2008-10-01 09:37:34

+6

`myString =", ". Join (myList)` даже если список содержит числа. Я просто попробовал. – zengr 2012-11-01 03:37:29

55

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

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

Не вы просто хотите:

",".join(l) 

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

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

1

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

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

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

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

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

4

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

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

@Peter Hoffmann

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

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

print str(l)[1:-1] 

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

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

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

3

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

string = ''.join([str(i) for i in list]) 
7

",".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' 
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 
2
>>> my_list = ['A', '', '', 'D', 'E',] 
>>> ",".join([str(i) for i in my_list if i]) 
'A,D,E' 

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

-1

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

Смежные вопросы