2016-06-13 2 views
2

기본 사전이 있습니다. 많은 문자열을 반복하고 사전에 해당 값이없는 경우에만 키 아래의 디렉토리에 추가합니다. 그래서 내 코드는 다음과 같습니다이 값이 사전에 존재하지 않으면 값 추가

from collections import defaultdict 
strings = ["val1", "val2", "val2", "val3"] 
my_dict = defaultdict(list) 

key = 0 
for string in strings: 
    if string not in my_dict.itervalues(): 
     my_dict[key].append(string) 
     key += 1 

print my_dict 

을하지만 문자열 모두가 사전에 추가되기 때문에 다음과 같이 작동하지 않을 것 같다

defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val2'], 3: ['val3']})

'을 val2'를 추가 할 수 없습니다한다 그것은 다음과 같습니다한다 : 내가 잘못 뭐하는 거지

defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val3']})

?

+3

예. 이 표현식의 결과를 추측 해보십시오. [1]에서 [1], [1]에서 [1] 그리고 [[1]에서'[1] '. 패턴을 식별 할 수 있으면이 지식을 실제 문제에 적용 할 수 있습니다. – Kevin

+0

나는 당신이 결국 무엇을 성취하려고하는지, 왜 defaultdict를 사용하고 있는지 확실하지 않습니다. 중복 된 'dict (zip (range (len (dedup)), dedup))'을 제거하기 위해'dedup = set (strings)'을 사용하여리스트를 사전으로 만들까요? – raphv

+0

@Kevin, 고맙습니다. 지금은 어떻게 작동하는지 보여 드리겠습니다. – GohanP

답변

2

my_dict.itervalues()은 케이스 목록을 반환합니다. 그래서 string not in lists은 항상 당신 itertools.chain.from_iterable를 사용하여리스트로,

>>> "val2" not in [["val1"], ["val2"]] 
True 

원하는 결과를 얻으려면, 다음 코드에서 목록의 평면 목록을 볼 수, True 반환

>>> import itertools 
>>> "val2" not in itertools.chain.from_iterable([["val1"], ["val2"]]) 
False 

귀하의 사례에 대한 전체 소스 코드,

from collections import defaultdict 
import itertools 

strings = ["val1", "val2", "val2", "val3"] 
my_dict = defaultdict(list) 

key = 0 
for string in strings: 
    if string not in itertools.chain.from_iterable(my_dict.values()): # flat a list of lists into a list 
     my_dict[key].append(string) 
     key += 1 

print(my_dict) 
# Output 
defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val3']}) 
관련 문제