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 一起使用

4

3 回答 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']}]}
于 2013-06-10T01:18:17.773 回答
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 年发布......!

于 2013-06-10T01:04:07.640 回答
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']}]}
于 2013-06-10T01:20:37.297 回答