我正在尝试将一个键值对从一个字典添加到另一个字典。听起来很简单,但字典的复杂性却大不相同。对于上下文,我通过使用 python 模块 json
和 csv
解析两个数据文件来构建两个字典。 json
字典很复杂,有多个级别,而我的 tsv
字典是键值对的简单字典。让我在索引 1 处对它们进行切片以说明这一点:
json_data['objects']['counties']['geometries'][1]
>> {'arcs':[[4,5,6,7,8,9]], 'id':30105, 'type': 'Polygon'}
好吧,我想我不能在 1 处对 tsv 字典进行切片,但是一个示例切片是:
tsv_data[30105]
>>'Valley'
注意我的 tsv 键是整数,两个字典的索引是不同的,事实上 len(tsv_data) != len(json_data[et all])
。但没关系。我的目标是以这样一种方式合并它们,即我将名称属性作为键值对添加到 json 文件中,如下所示:
json_data['objects']['counties']['geometries'][1]
>> {'arcs':[[4,5,6,7,8,9]], 'id':30105, 'type': 'Polygon', 'name':'Valley'}
我复制了一个切片来试水:
json_data_subset = copy.copy(json_data['objects']['counties']['geometries'][1])
json_data_subset['name'] = tsv_data[json_data_subset['id']]
>> {'arcs':[[4,5,6,7,8,9]], 'id':30105, 'type': 'Polygon', 'name':'Valley'}
如您所见,在本例中它起作用了。所以我认为我走在正确的轨道上并继续迭代:
j = json_data['objects']['counties']['geometries']
for i in j:
j[i]['name'] = tsv_data[j[i]['id']]
但这给了我:
TypeError: list indices must be integers or slices, not dict.
但它在上述情况下有效,我不确定为什么它改变了调子。
我可以做什么来迭代和合并字典,就像我对单切片案例所做的那样?
为清楚起见,我尝试做的是使用 for 循环使用 的
文件。从那里我可以从 id
键在 tsv
文件中找到相应的 ID 号>jsontsv
中检索匹配的名称,然后我想将其作为 'name':'Name of Value' 插入到
。我很确定这是最好的方法之一,因为我没有顺序或匹配命令之间的命令。如果我对此有误,请随时提出更好的方法。json
文件中
编辑:
为了检查我的确切案例,我将提供创建字典的代码以及指向 json
和 tsv
的链接。这样,您只需复制和粘贴即可准确查看幕后情况。
import json
with open('us.json') as f:
json_data = json.load(f)
import csv
with open('us-county-names.tsv') as f:
tsv_obj = csv.reader(f, delimiter='\t')
tsv_data = {int(rows[0]):rows[1] for rows in tsv_obj}
link到 json 和 tsv(有点大,但不过分)
最佳答案
您遇到的问题是因为 j
不是 dict
,它是一个 list
。你需要更多类似的东西:
j = json_data['objects']['counties']['geometries']
for i in j:
name = tsv_data.get(i['id'])
if name is None:
print('id %d not found' % i['id'])
else:
i['name'] = tsv_data[i['id']]
关于python - 迭代字典合并问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42328489/