문자열 배열이 아닌 객체 배열의 Python string.join (list)


291

파이썬에서는 다음과 같이 할 수 있습니다.

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

객체 목록이있을 때 쉽게 할 수있는 방법이 있습니까?

>>> class Obj:
...     def __str__(self):
...         return 'name'
...
>>> list = [Obj(), Obj(), Obj()]
>>> ', '.join(list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, instance found

아니면 for 루프를 사용해야합니까?

답변:


431

대신 목록 이해 또는 생성기 표현식을 사용할 수 있습니다.

', '.join([str(x) for x in list])  # list comprehension
', '.join(str(x) for x in list)    # generator expression

3
또는 생성자 표현식 : ','.join (str (x) in x in list)
dF.

1
그들 중 어느 것이 더 빠를 지에 대한 아이디어가 있습니까?
gozzilli

내 실험에 따르면 목록 이해는 작은 목록에서 60 % 더 빠를 수 있습니다 (실험은 3 개의 객체 () 목록에서 10 ^ 6 번 실행). 그러나 성능은 큰 목록 (10 ^ 7 objects () 목록에서 두 번째 실험 실행)에서 비슷합니다.
gozzilli

3
30 %의 빠른 속도 향상 (위의 발전기 표현에 비해)은 읽기 어려운 map표현 (아래)을 사용할 수 있습니다 .
K3 --- rnc

2
이 답변은 map솔루션 보다 객관적으로 나쁩니다 .
PascalVKooten

95

내장 문자열 생성자는 자동으로 다음을 호출합니다 obj.__str__.

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

1
map ()은 목록을 변경하지 않습니다. [목록의 o에 대한 str (o)]
dF와 같습니다.

11
+1 :지도는 좋은 접근 방법입니다. "목록 변경"은 정확한 설명이 아닙니다.
S.Lott

2
(또 다른) +1 ..지도는 읽기 쉽지 않으며,지도 기능이 무엇인지 알아야합니다.
lapax

1
@Michael 정확하지 않습니다. reduce그것은 사람들이 추측하기 때문에 "파이 토닉"하지 않았기 때문에 제거 된 것입니다. map반면에 문제는 아닙니다.
PascalVKooten

1
(또 다른) +1 : Perl 세계에서 온 이것은 우주에서 가장 일반적인 것입니다 : join ( "sep", list)-리스트의 모든 요소는 문자열 표현으로 변환됩니다. 파이썬에서 해결책을 찾기 위해 고심하고 있습니다.
Jason

2

또 다른 해결책은 str 클래스의 결합 연산자를 대체하는 것입니다.

다음과 같이 새로운 클래스 my_string을 정의하자

class my_string(str):
    def join(self, l):
        l_tmp = [str(x) for x in l]
        return super(my_string, self).join(l_tmp)

그럼 넌 할 수있어

class Obj:
    def __str__(self):
        return 'name'

list = [Obj(), Obj(), Obj()]
comma = my_string(',')

print comma.join(list)

그리고 당신은 얻을

name,name,name

BTW, list 를 변수 이름 으로 사용 하여 목록 클래스 (키워드)를 재정의합니다! 다른 식별자 이름을 사용하는 것이 좋습니다.

내 대답이 도움이 되길 바랍니다.


1

나는이 슈퍼 된 게시물입니다 알지만, 오버라이드 (override)됩니다 놓친 어떻게 생각 __repr__때문에, __repr__ = __str__이것의 허용 대답하는 질문 표시 중복 .

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