如何加入词典

4

我有数据

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

问题:如何在列表之间进行连接? 给出的结果:

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

我正在使用Python S60和Python 2.2。

5
Python 2.2?你肯定可以升级... - TerryA
你确定要一个单项字典列表,而不是一个包含多个项的字典吗?除非你有外部限制,否则这是一个相当奇怪的数据结构使用。 - Zero Piraeus
3个回答

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
在 Python 2.2 中:
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']}

如果您使用的是Python > 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']}]}

考虑升级您的Python版本,2.2版已于2001年发布...!


不是在Python 2.2版本,他们做不到。 - Zero Piraeus
我的手机上的Python 2.2是最后一个版本 :( - Agus Ibrahim
@Nirk 决定推出 2.2 版本,它与 defaultdict 基本相同 :) - Andy Hayden

1

以下是一个简单的答案,使用Python 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 实际要求的内容(单键字典列表)- 尽管显然它是更好的数据结构,其他条件相等。 - Zero Piraeus
@ZeroPiraeus 你说得对。我已经修复了,现在结果与预期相同! - Óscar López

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接