如何有效地处理带有动态键的Python字典?在
我使用来自荷兰的开放数据。每年都有一本词典。每年的字典键都不一样。如何编写有效的代码来处理这个问题?在
我有两个工作结构,如下面的示例所示:但是这两个结构都需要为每个键付出努力,而且开放数据中有108个键,所以我真的希望Python提供一个我还不知道的更好的解决方案!在
关于开放数据: 每年都有16194本字典。NL每个社区一本字典。每个字典有108个条目(键、值对):
>>> import cbsodata
>>> table = '83487NED'
>>> data = cbsodata.get_data(table, dir=None, typed=False)
Retrieving data from table '83487NED'
Done!
>>> len(data)
16194
>>> data[0]
{'Gehuwd_14': 1565, 'MateVanStedelijkheid_105': 5, 'Bevolkingsdichtheid_33': 1350, 'Gemeentenaam_1': 'Aa en Hunze ', ... etc
>>> len(data[0])
108
一个密钥可能是一年内的“代码”3,下一年的代码“4”。。。在
用于示例解决方案的示例数据:
^{pr2}$示例解决方案1,键映射:
def CBSkey(key, year):
if key == 'key_code':
if year == 2013:
return('Code_8')
elif year == 2014:
return('Code_8')
elif year == 2015:
return('Code_4')
elif year == 2016:
return('Code_3')
elif key == 'key_people':
if year == 2013:
return('Number_of_people_14')
elif year == 2014:
return('Number_of_people_14')
elif year == 2015:
return('Number_of_people_6')
elif year == 2016:
return('Number_of_people_5')
for record_now in tables[current_year]:
code = record_now['Code_3']
city = record_now['City_12']
people = {}
for year in years:
code_year = CBSkey('key_code', year)
people_year = CBSkey('key_people', year)
for record in tables[year]:
if record[code_year] == code:
people[year] = (record[people_year])
print(people)
所有3个示例解决方案的输出:
{2016: '24000', 2013: '14000', 2014: '18000', 2015: '22000'}
{2016: '88000', 2013: '74000', 2014: '76000', 2015: '86000'}
{2016: '133000', 2014: '129000', 2015: '131000'}
示例2,根据项选择正确的字典,然后循环所有其他键以查找附加数据:
for record_now in tables[current_year]:
city = record_now['City_12']
code = record_now['Code_3']
print('Code: ', code)
people = {}
for year in years:
for record in tables[year]:
for v in record.values():
if v == code:
for k in record.keys():
key_type = CBSkey(k)
if key_type == 'People_type':
people[year] = (record[k])
print(people)
希望有一些聪明的'Python'的想法,非常感谢!在
如果我正确理解这个数据集,每年的数据是 许多词条;某一年的所有词条都使用相同的键 密钥每年都不同,但可用的一般数据是相同的。 因此,您需要一种方法来高效地从多个 年。在
首先,我会把所有的年都放在一个大字典里,而不是用 您拥有的间接映射方案:
所以}都走开,}变成{}。在
tables
和所有个体{tables[year]
变成data[year]
,而{然后,我会画出一张从年份到关键点的地图。在
^{pr2}$这里有一种构造
ytok
的方法,它显示了 明确流程:这里有一个更精简的方法:
然后使用
ytok
,如下所示:注意一旦找到了正确的记录,就要使用
break
。有 一旦我们找到了想要的东西,再继续找一年也没用了, 所以我们打破了内部的for record
循环。在相关问题 更多 >
编程相关推荐