문자열 목록에서 쉼표로 구분 된 문자열을 어떻게 만드시겠습니까?


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'

목록에 정수가 포함되어 있으면 작동하지 않습니다.


목록에 문자열이 아닌 유형 (예 : 정수, 부동 수, 부울, 없음)이 포함 된 경우 다음을 수행하십시오.

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

python 2.7을 사용하고 있다면 (지금은 안됨) str의 사용은 목록의 항목에 유니 코드가 있으면 예외를 발생시킵니다.
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)모든 경우에 작동하지는 않습니다. StringIO와 함께 CSV 모듈을 사용하는 것이 좋습니다.

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'

StringIO파이썬 3 에는 없습니다
Ron Kalian

4
@RonKalian from io import StringIO파이썬 3에서의 사용
Kevin Ashcraft

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

참고 : 쉼표 뒤에 공백이 있습니다.



10

@ 피터 호프만

생성자 표현식을 사용하면 반복자를 생성하는 이점이 있지만 itertools 가져 오기를 절약 할 수 있습니다. 또한 목록 이해는 일반적으로 매핑하는 것이 바람직하므로 생성기 표현식이 imap보다 선호됩니다.

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

이 솔루션은 빈 문자열에 쉼표를 추가하지 않고 NoneType으로 'None'을 추가해야하는 요구 사항을 충족하지 않습니다.
Roberto

검사 str.join 속도와 작업을 list발전기에 비해
Grijesh 차우

3

다음은 list가 포함 된 예입니다.

>>> 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
이 질문은 목록이 아니라 목록에 관한 것 입니다.
Eero Aaltonen

@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로 출력하는 데 사용할 수도 있습니다 .

이 예제는 파이썬 3과 호환됩니다 StringIO. 파이썬 2 라는 다른 답변이 사용되었습니다 .


그러나 다른 답변에 비해 너무 많거나 복잡하지 않습니까?
Sreenikethan I

0

내가 빠진 것이 아니라면, ','.join(foo)당신이 원하는 것을해야합니다.

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

(편집 : jmanning2k가 지적한 것처럼,

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

요소가 쉼표를 포함 할 수있는 경우 결과 문자열을 구문 분석하기 어려울 수 있지만 더 안전하고 매우 Pythonic csv입니다.


-2

내 두 센트 파이썬에서 한 줄짜리 코드가 더 간단합니다.

>>> 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이며 문자열, 숫자, 없음 및 빈 문자열에서 작동합니다. 짧고 요구 사항을 충족시킵니다. 목록에 숫자가 포함되지 않으면 다음과 같은 간단한 변형을 사용할 수 있습니다.

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

또한이 솔루션은 새 목록을 만들지 않지만 @Peter Hoffmann과 같은 반복자를 사용합니다 (감사합니다).


이것은 불필요한 것입니다. 허용되는 답변은 간단하고 직접적이며 명확하게 가장 좋은 솔루션입니다. 지나치게 복잡한 대안을 제공하는 것은 무의미한 시간 낭비입니다. 이미 실행 가능한 답변이있을 때 언어의 다른 기능에 대해 교육하려고하는 경우 저에게 공감 한 것과 같은 일을하고 있습니다.
clearlight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.