2011-10-05 3 views
0

목록이 있습니다 : v = [1,2,2,3]. 이 목록을 키로 사용하고 싶습니다. 내가 "수동으로"그것을 할 수 있습니다 :파이썬에서 인덱스를 키로 사용하는 방법은 무엇입니까?

x = {} 
x[1,2,2,3] = 7 

그러나

X [V] =

(7)가 작동하지 않습니다. 내가해야 할 일을하는 가장 쉬운 방법은 무엇입니까?

x[open(v)] = 7 
+0

, 그것은 확실히'열려 있지()'; '[1,2,2,3]'이라는 파일을 읽으 려하고리스트는 문자열이 아니기 때문에 ... – SingleNegationElimination

답변

7

문제는 키가리스트되어 있지 않은, 불변해야한다는 것입니다 :

내가 그런 식으로 해결책을 상상

을 추가했습니다. 그러나 튜플 (Tuples)은 그렇습니다.

x[1,2,2,3] = 7 

을 쓰기로 위가 동일,

x[tuple(v)] = 7 

이 정교하고 후자는

x[(1,2,2,3)] = 7 
+0

이 부분을 좀 더 자세히 설명합니다; 당신이'x [1,2,2,3]'라고 말했을 때리스트로 전혀 색인을 생성하지 않는다면'x .__ getitem __ ([1,2,2,3])'와 같지 않습니다. '[] ''에도 불구하고'x .__ getitem __ ((1,2,2,3))'입니다. – SingleNegationElimination

2

의 구문 변형 :

간단히 조의 v 변환 Dict keys must be hashable. 목록은 해시 가능하지 않지만 튜플은 있습니다. 객체의 해시 값은 객체의 수명 동안 should never change입니다. 또한 equal을 비교하는 두 개의 해시 가능 객체는 동일한 해시를 가져야합니다. 목록이 변경 가능하기 때문에 두 조건을 모두 충족시키는 유일한 방법은 모든 목록을 동일하게 반환하는 것입니다 . 해시 값 대신이 가능하고 해시의 목적을 전복보다, 파이썬은 모든 변경 가능한 컨테이너 unhashable 만들기)

x[tuple(v)] 

x[1,2,2,3] 작품을 튜플이 아닌 괄호, indicated by the use of commas 때문에 :.

In [78]: 1,2,2,3 
Out[78]: (1, 2, 2, 3) 
2

파이썬이있다 값 목록을 저장하기위한 두 개의 유사한 데이터 구조. list은 변경 가능한 버전입니다. 값을 변경할 수 있습니다.

x = [1, 2, 2, 3] 
x = list((1, 2, 3, 4)) 

tuple은 변경 불가능한 버전입니다. 생성 된 값은 수정할 수 없습니다.

x = 1, 2, 2, 3 
x = (1, 2, 2, 3) 
x = tuple((1, 2, 2, 3)) 
파이썬은 그냥 목록에 튜플을 만들 필요가 있도록, 사전 키로 변경 가능한 유형을 사용하지 않는

: 잘

x[tuple(v)] = 7 
관련 문제