2012-09-18 6 views
2

목록의 각 항목에 대해 공백을 대시로 대체하는이 루프를 단순화하는 방법이 있습니까? 이 더목록의 각 항목에 대해 공백을 대시로 바꿉니다. -python

for item in a_list: 
    alist[alist.index(item)] = '-'.join(item.split(" ")) 

또는인가?

for item in a_list: 
    alist[alist.index(item)] = item.replace(" ", "-") 

참고 : 위의 솔루션은 다윗이 제안, 위의 작업을 수행 할 지능형리스트를 사용하여이 목록의 첫번째 발생을 업데이트합니다.

단어 목록이 있고 일부는 대시가 있습니다. a_list의 항목은 다음과 같습니다

this-item has a-dash 
this has dashes 
this should-have-more dashes 
this foo 
doesnt bar 
foo 
bar 

출력 목록의 모든 항목이 대신 공백의 대시가 있어야 곳, 같이한다 :

this-item-has-a-dash 
this-has-dashes 
this-should-have-more-dashes 
this-foo 
doesnt-bar 
foo 
bar 
+2

'.index'가 항목의 첫 번째 색인을 반환하기 때문에 목록에 중복 항목이있는 경우 두 가지 솔루션이 작동하지 않습니다. – jamylak

+0

jamylak, 데이비드의 목록 이해력 솔루션은 목록을 조작하는 무언가의 방법입니다. – alvas

+1

목록 이해력을 사용하는 것이 더 많은 파이썬이며, 일반적으로 더 간단하고 유연성이 뛰어나지 만, 목록 이해를 사용하지 않고 제자리에서 목록을 조작 할 수있는 방법을 이해하는 것은 가치가 있습니다 'index' 문제는 어느 시점에 나타날 것입니다. – abarnert

답변

5

사용 지능형리스트 :

a_list = [e.replace(" ", "-") for e in a_list] 
2

index 메서드를 사용하면 자신이 뭔가 잘못했을 가능성이 높습니다. (은 항상이지만 충분히 자주 생각하면됩니다.)

이 경우 목록을 순서대로 반복하고 현재 요소의 색인을 알고 싶습니다. 그것을 반복적으로 보는 것은 느리다. (그것은 O (N) 알고리즘 O (N^3)을 만든다.) - 더 중요한 것은 깨지기 쉽다. 예를 들어, 두 개의 동일한 항목이있는 경우 index는 두 번째 항목을 찾지 않습니다.

정확하게 이것은 enumerate을 위해 생성 된 것입니다. 그래서,이 작업을 수행합니다

a_list = ['-'.join(item.split(" ")) for item in a_list] 

이 느려질 수 또는 목록을 복사하는 것이 아니라 수정하고 있기 때문에 (더 많은 메모리를 사용할 수 있습니다

for i, item in enumerate(a_list): 
    alist[i] = '-'.join(item.split(" ")) 

한편, 당신은 지능형리스트와 루프를 대체 할 수 in-place)하지만, 거의 확실하게 중요하지는 않습니다 (원래 코드만큼 느리지는 않을 것입니다). 불변의 알고리즘은 더 간단하고 추론하기 쉽고 더 유연합니다. 튜플이나 임의의 반복 가능한 (iterable)리스트로이 버전을 호출 할 수있다.

또 다른 개선 사항으로, 실제로 split이 필요하고 join이 필요하거나 replace을 사용할 수 있습니까?

a_list = [item.replace(" ", "-") for item in a_list] 

당신은 몇 가지 유사한 성능 또는 가독성을 위해 더 좋을 수도있는 대신 정규 표현식을 사용할 수있는 경우 - 그러나 실제로 더 악화 될 나는이 경우 생각합니다. 그래서 일단 여기 도착하면 끝났어.

관련 문제