2013-08-08 3 views
1

나는 개별 단어의리스트를 살펴보고 그 단어가 키이고 그 단어의 색인이 값이되는 사전을 만든다.사전의 목록에 추가하기

dictionary = {} 
for x in wordlist: 
    dictionary[x] = wordlist.index(x) 

이 순간에 잘 작동하지만 내가 이상의 인덱스가 같은 단어가 두 번째 또는 세 번째 시간 등을 구가했다 그래서 만약 발견되면 추가 싶은 "나는 도시로 이동하기 위하여려고하고있다 "라고 말하면 다음과 같은 사전을 만들려고합니다.

{'I': 0, 'am' : 1, 'going' : 2, 'to': (3, 5), 'go' : 4, 'town' : 6} 

그래서 사전에 목록이 있어야할까요? 그런 다음 더 많은 색인을 추가 할 수 있습니까? 이것을 달성하는 방법에 대한 조언은 훌륭합니다!

+4

난 당신이 직면하고있는 문제가 무엇인지 확실하지 않다. 이미 원래 코드에 숫자를 저장하는 것과 같은 방식으로 사전에 목록을 저장할 수 있으며, 목록에 추가 할 때처럼 추가 할 수 있습니다. (즉, [ 'defaultdict'] (http://docs.python.org/2/library/collections.html#collections.defaultdict) 여기에 좋은 생각이 될 것입니다. – millimoose

답변

0

개체는 위치에 관계없이 개체입니다.

dictionary[x] = [] 
... 
dictionary[x].append(y) 
0

가능한 솔루션 :

dictionary= {} 
for i, x in enumerate(wordlist): 
    if not x in dictionary : dictionary[x]= [] 
    dictionary[x].append(i) 
+1

사전 [x 경우 KeyError 던졌습니다 ]가 아직 정의되지 않았습니다 – Stuart

+0

'x가 아니라면 dictionary :', 아니면'if dictionary.get (x, None) == None :'을 원했을 것입니다. 그러나 어느 쪽이든, 그것은 당신에게 _correct_ 대답을 줄 것이지만, 그것을하는 가장 좋은 방법은 아닙니다. – abarnert

+0

또한,'is None' 대신에'== None'을하고 싶지 않을 것입니다. – abarnert

7

당신은이 방법을 수행 할 수 있습니다

dictionary = {} 
for i, x in enumerate(wordlist): 
    dictionary.setdefault(x, []).append(i) 

설명 :

  • 당신은 index()에 대한 호출이 필요하지 않습니다. enumerate()을 사용하는 것이 더 효율적이며 시원합니다.
  • dict.setdefault()은 첫 번째 인수를 키로 사용합니다. 발견되지 않으면 두 번째 인수를 삽입하고 그렇지 않으면 무시합니다. 그런 다음 (아마도 새로 삽입 된) 값을 반환합니다.
  • list.append()은 목록에 항목을 추가합니다. 대신 튜플의 목록과

    {'I': [0], 'am' : [1], 'going' : [2], 'to': [3, 5], 'go' : [4], 'town' : [6]} 
    

    , 그것은 하나 개의 요소 만있는 경우에도 목록을 사용하여 :

이 같은 것을 얻을 것이다. 정말이 방법이 더 좋다고 생각합니다.

UPDATE : 영업 (! 감사)가 삽입되지 않습니다 [] 많이 구축하지 않기 때문에,이 코드는, 친절하고 빠른에 @millimoose에 의해 주석에 의해 뻔뻔 영감을

사전 :

import collections 
dictionary = collections.defaultdict(list) 
for i, x in enumerate(wordlist): 
    dictionary[x].append(i) 
+0

사실,'defaultdict'는 더 빠르지 않고 (파이썬에서 구현 된'__missing__' 메쏘드에 대한 많은 호출을 끝내기 때문에) 더 느릴 수도 있습니다. 그러나 어느 쪽이든 많은 차이가 있을지는 의문입니다. 더 중요한 것은 OP의 실제 코드에서 문제가 될지 의심 스럽습니다. 더 읽기 쉬운 것을 사용하십시오. – abarnert

+0

''random.shuffle'd N 사본 (/ usr/share/dict/words)의 빠른 테스트에서'defaultdict'는 CPython 3.3에서 약 30 % 더 빠르며 PyPy 2.0에서는 20 % 더 느립니다. 나는 실제로 그 반대를 기대했지만 ... 어느 쪽이든 그것은 (a) 차이가 매우 작고 (b) 당신이 정말로 최적화해야하는 경우 직감에 의존해서는 안됩니다 (또는 더 나쁜, 내 것!). – abarnert

+0

@abarnert : 실제로'defaultdict'에 관한 문서 때문에 더 빠르다고 생각했습니다 : "이 기술은'dict.setdefault()'를 사용하는 기술보다 더 간단하고 빠릅니다. 어쩌면 구체적인 것은 키/값의 비율에 따라 달라질 수 있습니다. – rodrigo

0
import collections 
dictionary= collections.defaultdict(list) 
for i, x in enumerate(wordlist) : 
    dictionary[x].append(i) 
+0

@ rodrigo의 업데이트 –

2
>>> wl = ['I', 'am', 'going', 'to', 'go', 'to', 'town'] 
>>> {w: [i for i, x in enumerate(wl) if x == w] for w in wl} 
{'town': [6], 'I': [0], 'am': [1], 'to': [3, 5], 'going': [2], 'go': [4]} 
+1

과 정확히 똑같지 만, 선형이 아니라 2 차입니다. 예를 들어,/usr/share/dict의 20 개 사본을 사용하면 rodrigo의 두 응답은 3 초 정도 걸리며, 몇 분이 걸립니다. – abarnert

+0

'... w in set (wl)}' – dansalmo

+0

하지만 그때 당신은 색인을 삽입하지 않습니다. 'enumerate (set (wl))'은 임의의 숫자를 줄 것이다; 'set (enumerate (wl))'은 유일하지 않습니다. 예를 들어 dict 맵핑 값을 인덱스로 DSU해야합니다.이 시점에서 defaultdict 버전보다 훨씬 복잡한 것을 만들었습니다. – abarnert

관련 문제