问个 Python 字典转换问题。

2019-11-20 18:30:34 +08:00
 Tianny
[{'a': {'b':1, 'c':2}}, {'a': {'d':3, 'e':4}}]

如何转换成下面的结构,也就是不同字典里相同 key 的值,如何将对应的 value 合并,并组成一个新的字典

{'a':{'b':1, 'c':2, 'd':3, 'e':4}}

谢谢大家,求支招

2826 次点击
所在节点    Python
16 条回复
lhx2008
2019-11-20 18:37:01 +08:00
for 一下不就好了,字典合并有方法
anonymous256
2019-11-20 18:46:35 +08:00
print(your_list[0].update(your_list[1]))
anonymous256
2019-11-20 18:54:19 +08:00
测试了下,不可以这样写,而且 update 是不返回结果
Tianny
2019-11-20 18:58:10 +08:00
@lhx2008 dict.update(),如果 key 相同,不是会覆盖 value 吗。我不想要覆盖 value
Tianny
2019-11-20 18:58:32 +08:00
@anonymous256 是的。而且 update 会覆盖具有相同 key 的 value
wuwukai007
2019-11-20 18:59:17 +08:00
你是单独的一个 a,还是好多个不同的 键,那要分组了
ClericPy
2019-11-20 18:59:59 +08:00
cherbim
2019-11-20 19:03:41 +08:00
好像之能 for 循环更新键值
anonymous256
2019-11-20 19:07:05 +08:00
l = [{'a': {'b': '1'}, 'b': '2'}, {'a': {'c': '3'}}]

empty = {}
for item in l:
for k, v in item.items():
if k in empty:
empty[k].update(v)
else:
empty[k] = v
print(empty)
输出: {'a': {'b': '1', 'c': '3'}, 'b': '2'}

大致是这样了, 实际的数据可能比这个复杂一点
anonymous256
2019-11-20 19:08:34 +08:00
重发一下
l = [{'a': {'b': '1'}, 'b': '2'}, {'a': {'c': '3'}}]
empty = {}

for item in l:
....for k, v in item.items():
........if k in empty:
............empty[k].update(v)
........else:
............empty[k] = v
print(empty)
输出: {'a': {'b': '1', 'c': '3'}, 'b': '2'}
wuwukai007
2019-11-20 19:21:48 +08:00
a=[{'a': {'b':1, 'c':2}}, {'a': {'d':3, 'e':4}},{'b':{'q':5}},{'b':{'z':7}}]
res = pd.DataFrame(a).T
res.mask(res.isna(),None,inplace=True)
dict_1 = {}
buffer = {}
for key,value in res.iterrows():
----x = [buffer.update(i) for i in value if i is not None]
----dict_1[key] = buffer.copy()
----buffer.clear()
dict_1 >>> {'a': {'b': 1, 'c': 2, 'd': 3, 'e': 4}, 'b': {'q': 5, 'z': 7}}
lhx2008
2019-11-20 19:42:11 +08:00
@Tianny #4 字典的 key 相同的时候,合并的时候肯定会覆盖呀,要是不想覆盖你在转成 k:[v1,v2]
andylsr
2019-11-20 19:51:45 +08:00
用 defaultdict,直接对值 update
andylsr
2019-11-20 20:05:21 +08:00
@andylsr
In [1]: from collections import defaultdict

In [2]: result = defaultdict(dict)

In [3]: items = [{'a': {'b':1, 'c':2}}, {'a': {'d':3, 'e':4}}]

In [4]: for item in items:
...: for k, v in item.items():
...: result[k].update(v)
...: result
Out[4]: defaultdict(dict, {'a': {'b': 1, 'c': 2, 'd': 3, 'e': 4}})
Latin
2019-11-21 14:22:39 +08:00
...: lst = [{'a': 123}, {'a': 456},{'b': 789}]
...:
...: temp = {}
...: for _ in lst:
...: for k, v in _.items():
...: dic.setdefault(k, []).append(v)
...:
...: print([{k:v} for k, v in dic.items()])
...:
...:
...:
...: [{'a': [123, 456]}, {'b': [789]}]
yucongo
2019-11-27 13:25:45 +08:00
from functools import reduce
lst = [{'a': {'b':1, 'c':2}}, {'a': {'d':3, 'e':4}}]

data = reduce(lambda x, y: {**x, **y}, [elm.get('a') for elm in lst])

{'a': data} #-> {'a': {'b': 1, 'c': 2, 'd': 3, 'e': 4}}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/621502

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX