2013-08-06 7 views
1

나는 이것을 오랫동안 두뇌에 쥐어 놨고, 이제는 그것을 현명한 사람들에게 건네고 있습니다. 목록의 길이는 1에서 100까지 다양합니다. 이 목록에는 대부분 하나 또는 두 개의 값이 중복 된 중복 항목이 있습니다. 모든 dict의 키는 항상 동일하게 유지됩니다. 예는 다음과 같을 것이다 : 자신의 현재 가치의 대부분은 동일로어떻게 파이썬에서 dicts 목록에서 dicts 병합?

myList = [ 
{"k1" : "v11", "k2" : "v21", "k3" : "v31", "k4" : "v41"}, 
{"k1" : "v12", "k2" : "v22", "k3" : "", "k4" : ""}, 
{"k1" : "v11", "k2" : "v21", "k3" : "", "k4" : "v41"}, 
{"k1" : "v11", "k2" : "v21", "k3" : "v31", "k4" : ""}, 
{"k1" : "v12", "k2" : "v22", "k3" : "v32", "k4" : ""} 
] 

는 지금은, myList에 [0]으로 myList [2]과 myList에 [3] 동일하다는 것을 알고있다. 마찬가지로 myList [1]과 myList [4]도 같습니다.

newList = [ 
{"k1" : "v11", "k2" : "v21", "k3" : "v31", "k4" : "v41"}, 
{"k1" : "v12", "k2" : "v22", "k3" : "v32", "k4" : ""} 
] 

도와 주셔서 감사합니다 사전에 많은 :

는 내가 원하는 것은이 같은 출력을 제공하는 함수 병합 (myList에)를 구현하는 것입니다.

건배, Paritosh

+4

을 왜' "K3" ""무시 당하고 있니? 병합 규칙은 무엇입니까? * 정확하게 *? –

+0

[어떻게 하나의 dicts 목록을 단일 dict에 병합합니까?] (http://stackoverflow.com/questions/3494906/how-do-i-merge-a-list-of-dicts-into- a-single-dict) – Marcin

+0

병합 규칙은 다음과 같습니다. 두 개의 dict에 최대 값 (해당 키용)이없는 경우 병합합니다. 그리고 모든 dicts를 하나의 dict에 병합하고 싶지 않기 때문에 언급 한 질문의 복제본이 아니기 때문에 최대 가능한 공통 값을 가진 dicts가 병합되어야합니다. 모든 dicts 값이 다른 경우 병합하지 않아야합니다. – Paritosh

답변

2
내가 defaultdict set와 값으로 모든 값을 수집하는 것

후 별도의 사전에 다시 값을 압축을 풉니 다;

from collections import defaultdict 
from itertools import izip_longest 

values = defaultdict(set) 
for map in myList: 
    for key, value in map.iteritems(): 
     if value: 
      values[key].add(value) 

keys = list(values) 
newList = [dict(zip(keys, row)) for row in izip_longest(*(sorted(v) for v in values.itervalues()), fillvalue='')] 

지금 우리가 얻을 : 일부 실험에서 당신은 출력 사전 만들기 위해 빈 값을 무시하고 만 다시 넣어하려는 추측 오전 그래서

[{'k1': 'v11', 'k2': 'v21', 'k3': 'v31', 'k4': 'v41'}, 
{'k1': 'v12', 'k2': 'v22', 'k3': 'v32', 'k4': ''}] 
+0

해결책을 확인했습니다. 주어진 값에 대해 아름답게 작동합니다. 그러나 입력을 약간 더 복잡하게 만들면 실패합니다. 예를 들어, myList = [{ "k1": "v11", "k2": "v21", "k3": "v31", "k4": "v41"}, { "k1": "v12 ","v2 ","k3 ":" ","k4 ":"}}, { "k1": "v11", "k2": "v21", "k3": "", "k4": "v41"}, { "k1": "v11", "k2": "v21", "k3": "v31", "k4": "}} {"k1 " "v2", "k3": "v32", "k4": "}}, {"k1 ":"v12 ","k2 ":"v23 ","k3 ":" v33 ","k4 ":"v43 "} ]'. myList [5]를 사용하는 출력은 별도의 dict로 기대됩니다. 최대 값은 중복되지 않습니다. – Paritosh

관련 문제