2017-05-20 1 views
1

사전 목록을 하나의 출력으로 결합하는 데 거의 문제가 없습니다.사전 목록 쌓기

나는 사전의 다음과 같은 목록을 가지고있다 :

listOfDicts = [{"name": "Andi", "toy": "puppet"}, {"name": "Andi", "toy": "monkey"},{"name": "Mum", "toy": "ape"}, {"name": "Mum", "toy": "sheep"}] 

을하고 "이름이"나는 하나 개의 필드에 결합 된 "장난감"의 가지고에 대한 그래서 나는 다음과 같은 OUPUT을하고 싶습니다. 최종 출력은 다음과 같아야합니다.

finalDicts = [{"name": "Andi", "toy": "puppet, monkey"}, {"name": "Mum", "toy": "ape, sheep"}] 

어떻게 이것을 파이썬에서 수행 할 수 있습니까?

+0

이름 순서가 동일해야합니까? –

+0

쉼표로 구분 된 단일 문자열이 아닌 장난감을 저장하는 데 목록을 사용하는 것이 좋습니다. – timgeb

답변

0

매우 절차 적 방법은 될 것이라고 할 수 있습니다 : 당신이 순서를 유지하려는 경우

temp_store = {} 
for element in listOfDicts: 
    temp_store[element["name"]] = temp_store.get(element["name"], []) + [element["toy"]] 
finalDicts = [{"name": element, "toy": ", ".join(temp_store[element])} for element in temp_store] 

당신은 temp_store에 대한 collections.OrderedDict를 사용할 수 있습니다. 당신은 항목을 수집하는 collections.defaultdict를 사용할 수

0

: 당신이 defaultdict을 원하지 않는 경우

from collections import defaultdict 
result = defaultdict(list) 
for dct in listOfDicts: 
    result[dct['name']].append(dct['toy']) 

print(result) 
# defaultdict(list, {'Andi': ['puppet', 'monkey'], 'Mum': ['ape', 'sheep']}) 

이 같은 정상적인 사전에 수행 할 수 있습니다

result = {} 
for dct in listOfDicts: 
    try: 
     result[dct['name']].append(dct['toy']) 
    except KeyError: 
     result[dct['name']] = [dct['toy']] 

은 그럼 그냥 필요 목록을 만들고 목록을 join 목록으로 만드십시오.

resultlist = [{'name': key, 'toy': ', '.join(value)} for key, value in result.items()] 
print(resultlist) 
# [{'name': 'Andi', 'toy': 'puppet, monkey'}, {'name': 'Mum', 'toy': 'ape, sheep'}] 

그러나 중급 사전이 "순서가 지정되지 않았으므로"Andi 앞에 임의로 결과를 Mum으로 지정할 수 있습니다. 올바른 주문을 보장하기 위해 collections.OrderedDict을 사용할 수 있습니다. 그런 다음 두 번째 코드 블록에 표시된 방법을 사용하여 코드를 작성하십시오.