2010-07-04 8 views
25

for 루프를 사용하여 목록의 항목을 수정하려고하는데 오류가 발생합니다 (아래 참조). 샘플 코드 :루프의 목록 항목 수정 (파이썬)

#!/usr/bin/env python 
# *-* coding: utf8 *-* 

data = [] 
data.append("some") 
data.append("example") 
data.append("data") 
data.append("here") 

for item in data: 
    data[item] = "everything" 

오류 :

Traceback (most recent call last): 
    File "./testy.py", line 11, in <module> 
    data[item] = "everything" 
TypeError: list indices must be integers, not str 

이 문제를 해결하기 위해 어떤 방법이 있나요?

답변

57

대신을 시도해보십시오

for i in xrange(len(data)): 
    data[i] = "everything" 

이 발생하는 근본적인 문제는 data이 목록을 인으로, data[i]을 쓸 때의 i 요구 정수, 목록에 숫자 인덱스 될 것입니다. 그러나 루프에서

for item in data 

item 목록에의 실제 것, 즉 문자열이 아닌 물건의 숫자 인덱스입니다. xrange은 목록의 값 대신 숫자를 생성하는 반복기이므로 사용할 수 있습니다.

대안은 그래서 당신이해야 할 모든 인덱스를 가지고 항목에 대해 잊지되면, enumerate 기능은 당신에게 양식 (index, item)의 튜플의 반복자를 제공

for i, _ in enumerate(data): 
    data[i] = "everything" 

될 것이다. 한 가지 방법이나 다른 방법 (enumerate 또는 xrange)이 훨씬 빠르고 빠를 것이라고 확신하지 못합니다. 목록에서 변수의 길이를 저장하여 목록 요소를 통해 계산하지 않고도 빠르게 액세스 할 수 있다고 생각하기 때문입니다.

for i, item in enumerate(data): 
    data[i] = func(item) 

이런 종류의 : 새 목록 값을 계산하기 이전 목록 값을 필요로하는 경우 파이썬 목록에서 요소를 보이게 피하기 때문에

그러나 enumerate 방법은 아마 약간 빠른 것 이 작업을 수행 할 때

data = [func(item) for item in data] 

는, 파이썬 그래서, data의 각 항목을 통과 여기에 기능을 적용하고, 자동으로 결과에서 새 목록을 구성합니다 : 일이 더 잘하지만 지능형리스트로 표현된다 와이 목록의 올바른 위치에 func(item)의 결과를 두는 것에 대해 걱정할 필요가 없습니다. 원래 예제는 실제로 다음과 같이 표현할 수 있습니다.

data = ["everything" for item in data] 
+0

그것은 좀 이상 (또는 해결 방법)을 보이지만, 제대로 작동합니다. 우선 순위가 높은 항목 (목록에 있음)에 ID를 지정해야한다는 것을 알지 못했습니다. 감사. –

+4

@sigo : 실제로는 전혀 해결 방법이 아닙니다.이 작업을 수행하는 데는 100 % 정확하고 완벽하게 정상적인 방법입니다 (그러나 목록 통합에 대해 언급 한 내용을 참고하십시오). –

+2

이 특별한 경우에,리스트 이해력은 더 빠른'data = [ "everything *] * len (data)'로 대체 될 수 있습니다. – EOL

5

목록 항목은 정수 인덱스로 액세스됩니다. i. 이자형. 귀하의 예에서 data[1] == 'example'. 이것이 문자열을 조회로 사용할 때 파이썬이 불평하는 이유입니다.

data[data.index("some")] = "something else" 

을하지만 당신은 단지 그들에 루프를 원하는 경우 다윗이 제안, enumerate()을 사용

당신이 그 가치에 의해리스트의 요소를 찾으려면, 당신은 data.index("value")를 사용할 수 있습니다.

0

정수를 사용하는 목록의 색인 생성은 비효율적 일 수 있습니다. 파이썬은 링크 된 테이블을 기본 포인터와 함께 사용하여 목록 요소를 저장합니다.이 경우, 특정 항목을 찾으려면, 파이썬은 i 번째 항목까지 목록을 탐색해야합니다.

다음과 같은 형식을 사용하는 것이 효율적이 될 수 있다고 제안 : A [:] = [x는 * X A의 X 용]