根据特定键合并Python字典值

1 投票
3 回答
1630 浏览
提问于 2025-04-17 04:55

我想把两个CSV文件合并,这两个文件我已经用下面的代码读入到Python中了,

a = csv.DictReader(csv1)
b = csv.DictReader(csv2)

aMap = {}
bMap = {}

for row in a:
    aMap[row['id']] = row

for row in b:
    bMap[row['id']] = row

现在我应该有两个字典,字典的键是两个CSV文件中的'id'字段。我想做的是把aMap中的所有内容,添加到bMap中对应的键值下。例如,在aMap中,一个字典的键看起来是这样的,

'123456' : {'name': 'SomeName', 'type': 'someType'}

而在bMap中,我有的是

'123456' : {'location' : 'someLocation'}

我想要的结果是,

'123456' : {'location' : 'someLocation', 'name' : 'SomeName', 'type' : 'someType'}

请问有没有专门的函数可以做到这一点,还是说我需要创建一个新的字典?类似于update()的功能,但只是追加值,而不是更新。

3 个回答

0

我觉得你可以使用collections模块里的defaultdict来解决这个问题。http://docs.python.org/library/collections.html#collections.defaultdict

我认为里面的例子跟你想要的非常接近。

0

我觉得没有现成的函数可以做到这一点。所以你需要做一些类似下面的操作:

def AppendToValues(from_map, to_map):
  for key in from_map:
    to_map[key] = to_map.get(key, {})
    to_map.update(from_map.get(key, {}))

要从地图(也就是字典)中删除某个键值对,可以这样做:

del my_map[key]
1

你可以使用一个叫做 collections.defaultdict 的东西,然后用 update 方法把 csv2 的行合并到一起。

import collections

aMap = collections.defaultdict(dict)

for row in csv.DictReader(csv1):
    aMap[row['id']] = row

for row in csv.DictReader(csv2):
    aMap[row['id']].update(row)

撰写回答