【发布时间】:2016-07-09 08:24:39
【问题描述】:
我想创建带有嵌套字典和重复键的数据结构。一个详细的例子是:
data['State1']['Landon']['abc Area'] = 'BOB'
data['State1']['Landon']['abc Area'] = 'SAM'
data['State1']['Landon']['xyz Area'] = 'John'
data['State2']['New York']['hjk Area'] = 'Ricky'
for z in data['State1'].keys() ,
# I should get list ['Landon', 'Landon', 'Landon']
for y in data['State1']['Landon'].keys() ,
# I should get list ['abc Area', 'abc Area', 'xyz Area']
目前存储数据我使用了额外的计数器键
data = Autovivification()
data[state][city][area][counter] = ID
但是在解析城市/区域的总条目(以及重复项)时,我必须使用嵌套循环直到计数器键。
for city in data['State1'].keys():
for area in data['State1'][city].keys():
for counter in data['State1'][city][area].keys():
for temp in data['State1'][city][area][counter].values():
cityList.append(city)
areaList.append(area)
对于嵌套字典,我找到了nosklo发布的以下代码
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
对于带有重复键的字典,我找到了 Scorpil 发布的代码
class Dictlist(dict):
def __setitem__(self, key, value):
try:
self[key]
except KeyError:
super(Dictlist, self).__setitem__(key, [])
self[key].append(value)
如何合并 Autovivification 和 Duplicate class code?或者有没有其他pythonic方式来处理这种情况?
【问题讨论】:
-
你能解释一下,为什么需要重复的键? 'Area' 是否可以列出,您可以在其中添加多个 ID?
-
@germn : 我已经编辑了这个问题并提供了更多解释,请您检查一下
-
我更新了答案,添加了新的
items_in函数,该函数将返回给定数据所需的列表。我确信实现函数以使用 dict/list 结构,然后尝试实现您的新结构会更容易和更清晰。 -
@GerasimovMikhail 非常感谢!!!
标签: python dictionary autovivification