문자 목록을 문자열로 변환


답변:


585

join빈 문자열 의 메소드를 사용하여 다음 과 같이 빈 문자열과 함께 모든 문자열을 결합하십시오.

>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'

1
문자 사이에 공백을 어떻게 추가 할 수 있습니까? 어쨌든 전체를 반복하지 않고 그것을해야합니까?
clifgray

18
단지 할 ' '.join(list)따옴표 사이에 공간
clifgray

이것에 대한 좋은 점은 각 항목에 대해 줄 바꿈을 사용하여 txt에 목록을 쓰려면 '\ n'.join (a)을 사용할 수 있다는 것입니다.
Norfeldt

28
명확히하기 위해 : "".join(['a','b','c'])의미 Join all elements of the array, separated by the string ""합니다. 같은 방식 " hi ".join(["jim", "bob", "joe"])으로을 만듭니다 "jim hi bob hi joe".
Jack

39

이것은 JavaScript와 Ruby와 같은 많은 인기있는 언어에서 작동합니다. 왜 파이썬에서는 그렇지 않습니까?

>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'

이상하게도 파이썬에서는 join메소드가 str클래스에 있습니다.

# this is the Python way
"".join(['a','b','c','d'])

JavaScript 나 다른 인기있는 스크립트 언어와 같이 객체 join의 메소드가 아닌 이유 는 무엇 list입니까? 파이썬 커뮤니티가 어떻게 생각하는지에 대한 예입니다. join은 문자열을 반환하므로 문자열은 목록 클래스가 아닌 문자열 클래스에 배치되어야합니다. 따라서 str.join(list)메서드는 다음을 의미합니다. str구분 기호로 사용하여 목록을 새 문자열로 조인합니다 (이 경우 str빈 문자열 임).

어떻게 든 나는 잠시 후이 사고 방식을 좋아해야했다. 파이썬 디자인에서 많은 것들에 대해 불평 할 수는 있지만 일관성에 대해서는 불평 할 수 없습니다.


1
join 이리 스트 메소드가 아닌 문자열 메소드가되는 주된 이유는리스트 뿐만 아니라 iterable을 허용하기 때문 입니다. 생성기 표현식, 사전, 세트, ​​다양한 종류의보기 등을 사용할 수 있습니다. 따라서 대부분의 언어에서 배열 조인 작업보다 훨씬 유연합니다.
rosuav

파이썬 을 많은 동적 언어로 string.join()join()메소드 가있는 대부분의 컬렉션과 비교 했습니다 . iterables에 관해서는 iterable을 join()메소드 의 컬렉션 생성자와 체인에 묶는 것이 쉽고 읽기 쉬우므로 그러한 언어에는 문제가되지 않습니다 .
Paulo Scardine

예, 게으른 목록 (Haskell 스타일)이 있거나 시작하기 전에 목록을 메모리에 통합하는 데 익숙하다고 가정합니다. 필자의 요점은 파이썬의 수행 방식은 임의적이지 않으며 매우 정당화된다는 것입니다.
rosuav

1
임의의 것은 아니며 모든 클래스에서 네임 스페이스 오염을 피하기위한 디자인 결정입니다. :-)
Paulo Scardine

바로 그거죠. 게다가, 그것들 모두가 클래스는 아닙니다. "iterable"은 클래스가 아니라 프로토콜입니다. iterable을 사용하여 필터링, 맵핑, 조인 등을 수행 할 수 있습니다.
rosuav

15

Python 인터프리터가 이전 버전 인 경우 (예 : 일부 이전 Linux 배포판에서 일반적으로 사용되는 1.5.2) join()이전 문자열 객체에서 메소드로 사용 가능 하지 않을 수 있으며 대신 문자열 모듈을 사용해야합니다. 예:

a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

except AttributeError:
    import string
    b = string.join(a, '')

문자열 b은입니다 'abcd'.


10

가장 빠른 방법 일 수 있습니다.

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'

4
@WinstonEwert 예, 어제 저는 그런 일을해야하는 프로그램을 작성하고 있었고, 프로그램에서이 라인 카운트의 성능에 대한 몇 가지 방법을 벤치마킹했는데 결과는 약 20 % 더 빠릅니다.''.join(['a','b','c'])
bigeagle

2
내 벤치 마크 결과 조인 속도가 7 배 빨라졌습니다. pastebin.com/8nSc5Ek1 . 벤치 마크를 공유 하시겠습니까?
Winston Ewert

1
@WinstonEwert 당신이 맞아요. 나는 그 이유를 찾았습니다 : 내 프로그램에서 네트워크에서 int 목록을 가져온 다음 map(ord,a)불필요한 곳에서 문자열로 변환 하지만 join needs map(chr,a). 여기 내 벤치 마크 pastebin.com/1sKFm8ma
bigeagle

15
조기 최적화. 현재 상황을 읽고 이해하기가 너무 어렵습니다. 사용자가 작업에서 성능을 필요로하지 않는 한 간단하게 ''.join()읽을 수 있습니다.
Luiz Damim

5
동의하지 않음-프로그래머는 그러한 것들에 대해 가장 빠른 방법을 염두에 두어야합니다. 조금 더 오래 걸리는 하나의 간단한 조작은 큰 문제가 아닙니다. 그러나 이것은 작성된 모든 프로그램이 부풀어 오르고 너무 많은 리소스를 차지하는 방식입니다. 우리가 가능한 한 마른 것을 만드는 습관을 갖지 않으면, 우리는 .... Windows Vista와 같은 세상, 또는 Linux의 Upstart는 많은 작은 지름길의 좋은 예입니다. 물속에서 죽은 것처럼 '팽만감과 부양'. 둘 다 못 생겼어요 왜 100 % 표현력이있는 str (). join (a)를 사용하지 않습니까?
osirisgothra

4

감소 기능도 작동합니다

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'

1
운영자가 그 자체로 일류 시민이 아니라는 것은 항상 나를 괴롭 힙니다. 방식에서는 예를 들어, 그 (+ 시간을 줄일 수) 것
브라이언 민튼

계획에서, (reduce + '' h)또는 (apply + h)작동합니다. 그러나 파이썬에서 add 연산자는 정확히 2 개의 피연산자를 사용하므로 감소가 필요합니다. 그렇지 않으면, 당신은 할 수 operator.add(*h)있기 때문에, apply공식적으로 (일명 확장 호출 구문에 찬성 파이썬에서 사용되지 en.wikipedia.org/wiki/Variadic_function )
브라이언 민튼

3

목록에 숫자가 포함 된 경우 map()와 함께 사용할 수 있습니다 join().

예 :

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459

실제로 사용하는 것이 더 pythonic입니다''.join([str(i) for i in arr])
user1767754

@ user1767754 글쎄, Guido는 그 스타일을 선호하지만 map 함수를 사용하는 데 아무런 문제가 없습니다.
itsbruce

2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'

6
이것은 매우 느릴 것입니다. 를 사용하면 ''.join(h)하나씩 추가하는 방법보다 훨씬 빠릅니다.
Martijn Pieters

1
'the'파이썬 성경 (1400 + 1 페이지)에서 많은 곳에서 이것이 잘못되고 가능할 때마다 피해야한다고 알려줍니다. 또한 잘 알려지지 않은 파이썬 초보자 (기능을 모욕하지 말고 잘 ...)의 고통스럽고 명백한 상표이지만 약 5000 명의 사람들이 "하지 마십시오"라는 말을들을 것입니다.
osirisgothra

2

str.join가장 자연스러운 방법 외에도 모든 요소를 ​​한 번에 작성 io.StringIO하고 사용하는 것이 가능 writelines합니다.

import io

a = ['a','b','c','d']

out = io.StringIO()
out.writelines(a)
print(out.getvalue())

인쇄물:

abcd

생성기 함수 또는 a tuple또는 a 가 아닌 iterable과 함께이 접근법을 사용 하면 올바른 크기를 한 번에 할당하는 list임시 목록 작성을 저장합니다 join(1 문자 문자열 목록은 메모리 측면에서 매우 비쌉니다) ).

메모리가 부족하고 느리게 평가 된 객체를 입력으로 사용하는 경우이 방법이 가장 좋습니다.


0

다음 operator.concat()과 같이 사용할 수도 있습니다 .

>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'

Python 3을 사용하는 경우 앞에 추가해야합니다.

>>> from functools import reduce

내장 reduce()이 Python 3에서 제거되어 현재에 살고 있기 때문에 functools.reduce().

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.