2014-10-11 5 views
-2

안녕하세요, 저는 키와 값으로 사전을 대조하고 싶은 단어 목록을 가지고 있습니다. 실제로 목록의 단어 중 일부가 사전의 값에 나타나는지 알고 싶습니다. 이것은 아마도 파이썬에서 쉬운 작업이지만, 초보자이며, 분명히 이해하지 못하는 같은 오류가 계속 발생합니다. 여기 사전에있는 단어 목록을 확인하십시오.

합니다 (DICT 손에있다) 내 코드입니다 :

words = ["give", "a", "pearl", "to", "the" "elephant"] 

for k, v in dic.items(): 
    for word in words: 
     if word in v: 
      print(v) 

또는 대안 :

relevant = {d:reldic[d] for d in reldic if words in reldic[d]} 
print(relevant) 

내가 오류 :

TypeError: unhashable type: 'list' 

무엇 누락?

미리 감사드립니다.

업데이트 :

좋아,이 질문을 더 잘 이해하는 데 도움이됩니다.

dic = collections.defaultdict(set) 

for e in entries: 
    dic[e[1]].add(e[3]) 

그리고 마지막으로 내 사전 :

2000/9/1 abe D mes Español inan.|m.|m. 
2000/9/1 abe D luna Español inan.|m.|m. 
2000/9/1 abe D sol Español inan.|m.|m. 
2000/9/2 gacuri D meter Español v.t. 
2000/9/2 acuri D meter Español v.t. 
2000/9/2 yacuri D meter Español v.t. 

가 그럼 난 관련 블록의 컬렉션이 있습니다 :

reldic = {d:dic[d] for d in dic if len(dic[d]) > 1} 
+0

'reldic'이란 무엇입니까? – thefourtheye

+0

아마도 목록을 dict 키로 사용하려고 시도하고 있습니다. 허용되지 않습니다. – wim

+0

죄송합니다. "reldic"이 아니며 "dict"가 업데이트되었습니다. –

답변

1

특정 오류는 목록 (또는 '해시 가능'이 아닌 다른 문자)을 사전의 키로 사용할 수 없다는 것을 알려줍니다. 예를 들면 다음과 같습니다.

# all of the following are ok 
d = dict() 
d[3] = True 
d['text'] = True 
d[(3, 'text')] = True 

a_list = [] 
d[a_list] = 'ok?' # this is not ok 

코드의 첫 번째 버전은 사용할 수 있으므로 잘 사용할 수 있습니다. 당신이 사전 이해력을 사용하여 그것을하려는 것처럼 보이지만 당신이 가지고있는 것은 조금 비관적입니다.

당신이 작성하는지에 가까운, tersest 코드는 아마 같은 것입니다 :

relevant = {k:v for k,v in dic.items() if any(filter(lambda w: w in v, words))} 

그러나 그것은 확실히 읽을 수있는 이상한 아닌 명백한 일이다. 솔직히, 나는 당신의 첫 번째 코드 샘플을 가지고 가서 사전 comprehensions에 대해 좀 더 읽고 그들이 어디에서 사용해야하는지 더 잘 이해할 것입니다.

편집 : 이제 데이터를 조금 더 잘 풀 수 있습니다. 이제 당신이 형식을 사용하여 시작하자 :

dic = {'abe': {'luna', 'mes', 'sol'}, 
     'acuri': {'meter'}, 
     'gacuri': {'meter'}, 
     'yacuri': {'meter'}} 

우리는이보다 효율적으로하기 위해 일련의 작업을 사용할 수 있습니다 (등의 데이터를 다양한 크기에 따라 테스트해야 할 것이다). 당신이 부분적으로 처음부터 인덱스의 포인트를 패배 전체 인덱스를 통해 루프 가지고

words = ["give", "a", "pearl", "to", "the", "meter"] 
ws = set(words) 
[k for k,v in dic.items() if v.intersection(ws)] 
# ['acuri', 'gacuri', 'yacuri'] 

하지만 정말, 그 뒤로 모든 조금입니다. 처음에는 역방향으로 색인을 작성하려고합니다.

dic = collections.defaultdict(set) 
for e in entries: 
    dic[e[3]].add(e[1]) 

# note, we're now mapping from word -> book(?) 
dic = {'mes': {'abe'}, 
     'sol': {'abe'}, 
     'meter': {'acuri', 'gacuri', 'yacuri'}, 
     'luna': {'abe'}} 

# now it's simple and efficient to find all the books that contain the words 
sets_of_books_containing_words = [dic[w] for w in words if w in dic] 

# and to combine that together into a single set 
books_containing_one_of_the_words = set.union(*sets_of_books_containing_words) 
+0

감사합니다. @Aidan Kane, 목록에서 사전의 키가 될 수는 없지만 사전을 통해 확인하고 싶은 단어 목록이 있습니다. 목록으로 키를 사용하려고하지 않습니다. 나는 너를 올바르게 이해하기를 바란다. –

+0

예, 알 수 있습니다. 내 코드의 첫 번째 부분은 여전히 ​​'TypeError : unhashable type :'list ''오류를 생성합니다. 방금 체크했는데 'v'에 'set()'유형이 있습니다. 이것이 문제 일 수 있습니까? –

+0

더 많은 부분을 읽으면서 다음은 직접 관련이 없지만 답변과 링크에 좋은 읽을 거리가있는 질문입니다. http : //stackoverflow.com/questions/9010222/how-can-python-dict-have- 같은 키를 가진 다중 키. 나는 또한 당신을 투표합니다. – Elric

-2

d는 목록처럼 내 데이터의 모양을 그. 목록은 사전의 키가 될 수 없습니다.

+0

'd'는 키이고 키는리스트가 될 수 없습니다. – thefourtheye

관련 문제