2013-06-10 4 views
4

을 가입 I 데이터어떻게 사전

stat=[{'state': {'europe': ['germany', 'england']}}, 
     {'state': {'europe': ['french', 'netherland']}}, 
     {'state': {'asian': ['japan', 'china']}}] 

질문을했습니다 : 방법 목록 사이에 가입하는 방법? 지정된 결과 :

{'state': [{'europe': ['germany', 'england', 'french', 'netherland']}, 
      {'asian': ['japan', 'china']}]} 

내가 파이썬 2.2에서 파이썬 2.2

+5

파이썬 2.2? 확실하게 업그레이드 할 수 있습니다 ... – TerryA

+0

여러 항목이있는 하나의 dict 대신 단일 항목 dicts 목록을 원하십니까? 외부 제약 조건이 없다면 이는 다소 이상한 데이터 구조입니다. –

답변

1

파이썬 S60을 사용하고 있습니다 :

stat2 = {} 
for s in stat: 
    for c in s.values(): 
     for k, v in c.items(): 
      if k in stat2: 
       stat2[k] += v 
      else: 
       stat2[k] = v # perhaps copying here 

stat2 
{'asian': ['japan', 'china'], 
'europe': ['germany', 'england', 'french', 'netherland']} 

당신은 파이썬> 2.4을 사용한다면, 당신은 단지 defaultdict를 사용할 수 있습니다 :

from collections import defaultdict 
stat2 = defaultdict(list) 

for s in stat: 
    for c in s.values(): 
     for k, v in c.items(): 
      stat2[k] += v 

stat2 
defaultdict(<type 'list'>, {'europe': ['germany', 'england', 'french', 'netherland'], 'asian': ['japan', 'china']}) 

그리고 정말로 원한다면 :

{'state': [dict(stat2)]} 
{'state': [{'asian': ['japan', 'china'], 
    'europe': ['germany', 'england', 'french', 'netherland']}]} 

2001 년에 출시 된 Python 버전 업그레이드를 고려하십시오 ...!

+0

파이썬 2.2에서는 그렇지 못하다. –

+0

-1 : 컬렉션이 파이썬 2.2에 없었습니다. – SheetJS

+0

와우, 파이썬 2.2. –

3

본래의 시도 :

r={} 
for d in stat: 
    for k,v in d.iteritems(): 
     nd = r.setdefault(k,[]) 
     for tdk,tdv in v.iteritems(): 
      q = filter(lambda x: tdk in x.iterkeys(),nd) 
      if not q: 
       q = {tdk:[]} 
       nd.append(q) 
      else: q = q[0] 
      q[tdk]+=tdv 


print r 
# prints {'state': [{'europe': ['germany', 'england', 'french', 'netherland']}, {'asian': ['japan', 'china']}]} 
1

다음은 간단한 대답은 파이썬 2.2에서 사용할 수 구조를 사용하여,의, 공상 아무것도 :

ans = {} 
for d1 in stat: 
    for k1, v1 in d1.items(): 
     if k1 not in ans: 
      ans[k1] = [] 
     for k2, v2 in v1.items(): 
      for d2 in ans[k1]: 
       if k2 in d2.keys(): 
        d2[k2].extend(v2) 
        break 
      else: 
       ans[k1].append({k2:v2}) 

이 결과는 예상대로 :

ans 
=> {'state': [{'europe': ['germany', 'england', 'french', 'netherland']}, 
       {'asian' : ['japan', 'china']}]} 
+1

이 제품이 생산되지 않는다는 점은 분명 가치가 있습니다. 어떤 OP가 실제로 요구했는지 (단일 키 dicts의 목록) - 분명히 더 나은 데이터 구조이지만 그 밖의 모든 것은 동일합니다. –

+0

@ZeroPiraeus 당신 말이 맞아요. 나는 그것을 고쳤다, 결과는 예상대로이다! –