迭代字典合并问题

时间:2017-02-19 14:33:45

标签: python python-3.x dictionary

我正在尝试将一个键值对从一个词典添加到另一个词典。这听起来很简单,但是dicts的复杂性非常不同。对于上下文,我通过使用python模块jsoncsv解析两个数据文件来构建两个dicts。 json dict是复杂的,有多个级别,而我的tsv dict是一个简单的key:value对的dict。让我在索引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键是整数,两个dicts的索引是不同的,实际上是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必须是整数或切片,而不是dict。

然而它在上面的案例中起作用,我不确定它为什么改变了它的曲调。

我可以做些什么来迭代和合并dicts,就像我对单片案例所做的那样?

为清楚起见,我要做的是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(有点大,但不是过度杀伤)

1 个答案:

答案 0 :(得分:1)

您面临的问题是由于<div ng-repeat="cssframework in voce.framewrok"> <input type="checkbox" ng-model="costo" ng-change="AggiornaTotale({{cssframework.costo}})"/> <span>{{cssframework.name}}........<b>{{cssframework.costo | currency}}</b></span> </div> 不是j,而是dict。你需要更像的东西:

list