2009-03-18 5 views
2

해시 테이블/사전을 사용하여 작업 할 때 가끔 키 지정 방법에 어려움이 있습니다.해시 테이블 또는 사전 키 이름 저장 위치

예를 들어

: 나는 키 값 (다른 모듈에서) (이 예를 들어 파이썬을 사용하여) 간단한 사전,

foo = {'bar': 'baz', 'foobar': 'foobaz' } 

I 값에 액세스 할 수 있습니다 만들 경우 : (foo['bar']를) 및 baz 다시 얻을.

Dr. Evil의 말처럼 "정말 표준입니다."

키에 정적 문자열을 사용하면이 사전을 사용하여 모든 모듈을 구현과 밀접하게 연결할 수 있습니다. 물론 다른 키 유형 (예 : 열거 형, 객체 등)을 사용할 때도 적용 할 수 있습니다. 어쨌든 당신이 그것을 슬라이스, 사전에 액세스하는 모든 모듈은 키 값을 알고 있어야합니다.

이 문제를 해결하기 위해 일반적으로 정적 상수 문자열 값 (또는 언어에서 사용 가능한 경우 Enum)을 키에 사용하고 로컬 클래스/모듈 또는 별도의 모듈/클래스에 공개적으로 저장합니다. 따라서 사전 키 자체의 변경 사항은 단일 위치에 유지됩니다.

이 일반적으로 다음과 같습니다 : 같은 사전의 사용이 반드시 부부 모듈/클래스를한다는 것을 구현에 키를 지정 거기에 더 나은 방법

BAR_KEY = 'bar' 
foo[BAR_KEY] = 'foobar' 

있습니까?

참고 : SO에서 이에 대한 몇 가지 응답을 보았습니다 (예 : property-to-reference-a-key-value-pair-in-a-dictionary). 주제가이 문제를 구체적으로 다루지 않는 것으로 보입니다. 대답은 도움이되었지만 폭 넓은 경험을 원합니다.

답변

2

속성을 포함하고있는이 클래스를 만들지 않겠습니까? 이것은 (필자가 아는 바와 같이) 파이썬으로 훌륭하게 수행되며 다른 언어에서도 잘 작동합니다. 이름을 리팩토링하는 것은 오늘날의 도구에서도 마찬가지입니다.

+0

좋은 점, 키가 항상 알려져 있고 상수 인 경우 속성이있는 클래스/구조체에 배치하는 것이 좋습니다. – CodingWithSpike

+0

글쎄, 나는 보통 그렇게 할 때 사전은 여러 (3 +) 모듈에 의해 사용됩니다. 그러나 한 모듈에서 다른 모듈로 간단한 사전을 전달하는 중이라면 과장된 부분이 아닌 것 같습니까? 결국 많은 재산 클래스로 끝날 수도 있습니다 :) – bedwyr

+1

@ bedwyr, 분명히 파이썬에 대한 과용은 아닙니다 (Jensen의 답변 참조). 구조가 정의되기 때문에, 이해하기가 훨씬 쉬워집니다. (물론, 당신은 동적 타입의 언어로 그것을 뒤죽박죽 수 있습니다 ...) – strager

0

개인적으로, 나는 당신의 방법을 사용합니다. 그것은 꽤 합리적인, 간단하고 실제 문제를 해결합니다.

0

나는 보통 같은 일을합니다. 키가 항상 같을 경우 키를 보유 할 언어에 관계없이 '상수 정적'을 만드십시오.

1

가끔씩 사전 키를 저장할 별도의 클래스를 만듭니다. 그것들은 그들 자신의 네임 스페이스를 제공 할뿐만 아니라 키가 const 문자열에 있어야한다는 일반적인 이점을 제공합니다. 즉, 오타의 위험이 없으며, 코드 완성을 얻고, 문자열 값을 변경하기 쉽습니다. 별도의 클래스를 작성하지 않으려는 경우에는 const 문자열이있는 네임 스페이스를 제외한 모든 이점을 얻을 수 있습니다.

즉, 당신은 soft coding 영토에 가까워지고 있다고 생각합니다. 사전의 키가 변경되면 사전을 사용하는 코드가 변경 될 수 있습니다.

2

개체를 전달할 때 알려진 키가있는 경우 개체에 특성을 추가하는 것이 좋습니다. IMO, 사전의 유스 케이스는 키가 무엇인지 모를 때입니다.

파이썬은 간단하다 :

foo.bar=baz 

자바는 거의 동일합니다

class Foo { public String bar="baz"; } 

파이썬 성능 재산 조회 그냥 사전 조회 및 자바이기 때문에, 거의 동일 할 것 성능이 더 좋을 것입니다.

관련 문제