2014-04-01 6 views
6

저는 잠시 Python에서 작업 해 왔으며 "try"와 "except"를 사용하여이 문제를 해결했지만 문제를 해결할 다른 방법이 있는지 궁금합니다. . 나는 다음과 같은 내용으로 변수가 경우에 따라서루프 내 사전에 변수 목록을 초기화하십시오.

example_dictionary = {"red":[2,3,4],"blue":[6,7,8],"orange":[10,11,12]} 

:

기본적으로이 같은 사전을 만들려는 example_dictionary을 구현하기 위해

root_values = [{"name":"red","value":2},{"name":"red","value":3},{"name":"red","value":4},{"blue":6}...] 

내 방법이었다 :

example_dictionary = {} 
for item in root_values: 
    try: 
     example_dictionary[item.name].append(item.value) 
    except: 
     example_dictionary[item.name] =[item.value] 

내 질문이 명확하고 누군가가이를 도와 줄 수 있기를 바랍니다.

감사합니다.

답변

16

코드가 목록에 요소를 추가하지 않습니다. 대신 목록을 단일 요소로 대체합니다. 기존 사전의 값에 액세스하려면 속성 조회 (item['name']가 아니라 item.name이 아님)가 아닌 색인을 사용해야합니다.

사용 collections.defaultdict() :

from collections import defaultdict 

example_dictionary = defaultdict(list) 
for item in root_values: 
    example_dictionary[item['name']].append(item['value']) 

defaultdict 키가 아직 매핑에 존재하지 않는 경우 __missing__ hook on dict 자동 구체화 값을 사용하는 dict 서브 클래스입니다.

또는 사용 dict.setdefault() :

example_dictionary = {} 
for item in root_values: 
    example_dictionary.setdefault(item['name'], []).append(item['value']) 
0

목록 및 사전 함축 여기에 도움이 될 수 있습니다 ...

을 감안할 때

In [72]: root_values 
Out[72]: 
[{'name': 'red', 'value': 2}, 
{'name': 'red', 'value': 3}, 
{'name': 'red', 'value': 2}, 
{'name': 'green', 'value': 7}, 
{'name': 'green', 'value': 8}, 
{'name': 'green', 'value': 9}, 
{'name': 'blue', 'value': 4}, 
{'name': 'blue', 'value': 4}, 
{'name': 'blue', 'value': 4}] 

특정 이름 값을 추출 할 수 아래 item() 같은 기능 :

In [75]: def item(x): return [m['value'] for m in root_values if m['name']==x] 
In [76]: item('red') 
Out[76]: [2, 3, 2] 

다음은 사전 이해의 문제입니다 ...

In [77]: {x:item(x) for x in ['red', 'green', 'blue'] } 
Out[77]: {'blue': [4, 4, 4], 'green': [7, 8, 9], 'red': [2, 3, 2]} 
관련 문제