python - 迭代字典合并问题

标签 python python-3.x dictionary

我正在尝试将一个键值对从一个字典添加到另一个字典。听起来很简单,但字典的复杂性却大不相同。对于上下文,我通过使用 python 模块 jsoncsv 解析两个数据文件来构建两个字典。 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 号>json 文件。从那里我可以从 tsv 中检索匹配的名称,然后我想将其作为 'name':'Name of Value' 插入到 json 文件中。我很确定这是最好的方法之一,因为我没有顺序或匹配命令之间的命令。如果我对此有误,请随时提出更好的方法。

编辑:

为了检查我的确切案例,我将提供创建字典的代码以及指向 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/

相关文章:

python-3.x - 如何将 reduce 函数的每次迭代存储在列表中?

python - 检索与嵌套字典中最小值对应的键

c# automapper 字典到字典

hadoop - Hadoop OutputCollector重复键

python - 对于每组对 REST API 函数的调用,仅发送一封电子邮件

python - 在每次新递归时重置 Collat​​z 计数器

Python 二维数组的行为很奇怪

python - 使用py eureka客户端进行微服务互通

python - 是否可以在管理员之外使用 django-modeltranslation?

python - Bokeh 中的透明图例