我正在尝试从一个字典向另一个字典添加键值对。听起来很简单,但是字典的复杂性却大不相同。对于上下文,我通过使用python模块jsoncsv解析两个数据文件构建了两个字典。 json字典很复杂,具有多个级别,而我的tsv字典是key:value对的简单字典。让我在索引1处分别对其进行切片以说明这一点:

json_data['objects']['counties']['geometries'][1]
>> {'arcs':[[4,5,6,7,8,9]], 'id':30105, 'type': 'Polygon'}


好吧,我想我无法将tsv dict切片为1,但示例切片为:

tsv_data[30105]
>>'Valley'


请注意,我的tsv键是整数,并且两个字典的索引不同,实际上是len(tsv_data) != len(json_data[et all])。但没关系。我的目标是以这种方式合并它们,以便将name属性作为键值对添加到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:列表索引必须是整数或切片,而不是dict。


但是,它在上述情况下仍然有效,但我不确定为什么它会改变音调。

像我对单个切片案例所做的那样,我该怎么做才能迭代和合并字典?

为了清楚起见,我要尝试的for循环是使用tsv文件的id键在json文件中找到相应的ID号。由此,我可以从tsv中检索匹配名称,然后将其作为json插入到'name':'Name of Value'文件中。我很确定这是最好的方法之一,因为我在字典之间没有顺序或匹配的顺序。如果我错了,请随时提出一个更好的方法。

编辑:

为了检查我的确切情况,我将提供用于创建字典以及jsontsv链接的代码。这样,您可以简单地复制和粘贴以查看引擎盖下的实际情况。

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/

10-12 16:54