python - 합치기 - 파이썬 rstrip




파이썬 조인:왜 list.join(string) 대신 string.join(list)입니까? (6)

이것은 항상 나를 혼란스럽게했다. 이것은 더 좋을 것 같습니다.

my_list = ["Hello", "world"]
print my_list.join("-")
# Produce: "Hello-world"

이것보다:

my_list = ["Hello", "world"]
print "-".join(my_list)
# Produce: "Hello-world"

특별한 이유가 있습니까?


list.join(string) 대신에 string.join(list) list.join(string) 입니까?

이것은 join 이 "string"메소드이기 때문입니다! 모든 반복 가능한 문자열을 만듭니다. 우리가리스트에이 메소드를 붙이면리스트가 아닌 iterable을 가질 때는 어떨까요?

문자열의 튜플이 있다면 어떨까요? 이것이 list 메소드라면, 엘리먼트를 하나의 문자열로 결합하기 전에 list 의 모든 반복자를 캐스팅해야합니다! 예 :

some_strings = ('foo', 'bar', 'baz')

우리 자신의리스트 조인 메소드를 롤하자.

class OurList(list): 
    def join(self, s):
        return s.join(self)

그리고 그것을 사용하기 위해, 우리는 먼저 iterable의 문자열을 조인하기 위해 각각의 iterable로부터리스트를 생성해야만하며, 메모리와 프로세싱 파워 모두를 낭비해야합니다 :

>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'

따라서 우리는 내장 문자열 메서드를 사용하는 대신 목록 메서드를 사용하기위한 추가 단계를 추가해야합니다.

>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'

발전기에 대한 성능 경고

파이썬이 str.join 최종 문자열을 생성하기 위해 사용하는 알고리즘은 실제로 iterable을 두 번 전달해야하므로, 생성자 표현식을 제공하는 경우 최종 문자열을 생성하기 전에 먼저 목록으로 구체화해야합니다.

따라서 생성자 주위를 지나가는 것은 일반적으로리스트 str.join 보다 낫지 만 str.join 은 예외입니다.

>>> import timeit
>>> min(timeit.repeat(lambda: ''.join(str(i) for i in range(10) if i)))
3.839168446022086
>>> min(timeit.repeat(lambda: ''.join([str(i) for i in range(10) if i])))
3.339879313018173

그럼에도 불구하고 str.join 연산은 의미 론적으로 "문자열"연산이므로 다른 iterable보다 str 객체에 str.join 연산을 적용하는 것이 여전히 의미가 있습니다.


iterable은 목록뿐 아니라 결합 될 수 있기 때문에 결과와 "결합 자"는 항상 문자열이기 때문입니다.

예 :

import urllib2
print '\n############\n'.join(
    urllib2.urlopen('http://data.stackexchange.com/users/7095'))

둘 다 좋지 않습니다.

string.join (xs, delimit)은 문자열 모듈이 문자열의 경우에만 작동하기 때문에 비즈니스에 대해 알지 못하는 목록의 존재를 인식한다는 것을 의미합니다.

list.join (구분자)은 문자열이 근본적인 유형 (및 어휘로는 말하자면)에 익숙하기 때문에 조금 더 멋지다. 그러나 이것은 a.split("\n") 의 임의 컨텍스트에서 파이썬 컴파일러가 무엇이 무엇인지 알지 못하기 때문에 조인을 동적으로 전달해야한다는 것을 의미하며이를 (vtable 조회와 유사하게) 찾아야합니다. 당신이 많은 시간을 할 경우 비싸다.

파이썬 런타임 컴파일러가리스트가 빌트인 모듈이라는 것을 안다면 다이내믹 룩업을 건너 뛰고 바이트 코드로 인 텐트를 직접 인코딩 할 수 있습니다. 그렇지 않으면 "a"의 "join"을 동적으로 해결해야합니다. 파이썬은 동적 언어이기 때문에 호출 당 상속의 수 (호출 이후로, 결합의 의미가 변경되었을 수 있습니다).

슬프게도, 이것이 추상화의 궁극적 인 결함입니다. 어떤 추상화를 선택하든 관계없이 추상화는 해결하려는 문제의 맥락에서만 이해할 수 있습니다. 따라서 추상화를 근본적인 이데올로기와 일치시키지 않는 일관된 추상화를 가질 수는 없습니다 함께 당신의 이데올로기와 일치하는 관점에서 그들을 포장하지 않고. 이것을 알면, 파이썬의 접근 방식은 저렴하기 때문에보다 융통성이 있습니다. 자신의 래퍼를 만들거나 자신 만의 전 처리기를 사용하여 더 멋지게 보이게하는 것은 당신에게 달려 있습니다.


분할하는 것은 자연스러운 직각 조작이라고 생각하십시오.

나는 iterable에 적용될 수있는 이유를 이해하고 목록 상에 쉽게 구현 될 수 없다.

가독성을 위해 언어로보고 싶습니다만 실제로는 실현 가능하지 않다고 생각합니다. 반복성이 인터페이스라면 인터페이스에 추가 할 수는 있지만 관례에 불과하므로 핵심적인 방법은 없습니다. iterable 인 것들의 집합에 그것을 추가하십시오.


주로 someString.join() 의 결과가 문자열이기 때문입니다.

순서 (목록 또는 튜플 또는 기타)는 결과에 나타나지 않고 문자열 만 나타냅니다. 결과는 문자열이므로 문자열의 메서드로 이해할 수 있습니다.


- "-"에서 join (my_list)은 요소를 조인하는 문자열로 변환한다는 것을 선언합니다. 결과 지향적입니다. (쉽게 기억하고 이해할 수 있도록)

나는 당신의 참조를 위해 methods_of_string의 철저한 치트 시트를 만든다.

string_methonds_44 = {
    'convert': ['join','split', 'rsplit','splitlines', 'partition', 'rpartition'],
    'edit': ['replace', 'lstrip', 'rstrip', 'strip'],
    'search': ['endswith', 'startswith', 'count', 'index', 'find','rindex', 'rfind',],
    'condition': ['isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isnumeric','isidentifier',
                  'islower','istitle', 'isupper','isprintable', 'isspace', ],
    'text': ['lower', 'upper', 'capitalize', 'title', 'swapcase',
             'center', 'ljust', 'rjust', 'zfill', 'expandtabs','casefold'],
    'encode': ['translate', 'maketrans', 'encode'],
    'format': ['format', 'format_map']}




join