python - 如何在 python 中创建具有重复键的嵌套字典

标签 python dictionary autovivification

我想创建具有嵌套字典和重复键的数据结构。一个详细的例子是:

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 方式来处理这种情况?

最佳答案

另一个使用 defaultdict 的例子:

from collections import defaultdict


data = defaultdict(  # State
    lambda: defaultdict(  # City
        lambda: defaultdict(list)  # Area
    )
)


data['State']['City']['Area'].append('area 1')
data['State']['City']['Area'].append('area 2')
data['State']['City']['Area'].append('area 2')


areas = data['State']['City']['Area']
print(areas)  # ['area 1', 'area 2', 'area 2']

total = len(areas)
print(total)  # 3

如何使用此解决方案获取您想要的项目列表:

data['State1']['Landon']['abc Area'].append('BOB')
data['State1']['Landon']['abc Area'].append('SAM')
data['State1']['Landon']['xyz Area'].append('John')
data['State2']['New York']['hjk Area'].append('Ricky')


def items_in(d):
    res = []
    if isinstance(d, list):
        res.extend(d)
    elif isinstance(d, dict):
        for k, v in d.items():
            res.extend([k] * len(items_in(v)))
    else:
        raise ValueError('Unknown data')
    return res


print(items_in(data['State1']))  # ['Landon', 'Landon', 'Landon']
print(items_in(data['State1']['Landon']))  # ['xyz Area', 'abc Area', 'abc Area']
print(items_in(data['State1']['Landon']['abc Area']))  # ['BOB', 'SAM']
print(items_in(data['State1']['Landon']['xyz Area']))  # ['John']

print(items_in(data['State2']))  # ['New York']
print(items_in(data['State2']['New York']))  # ['hjk Area']

关于python - 如何在 python 中创建具有重复键的嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36154563/

相关文章:

python - facebook python-sdk post_to_wall 附件

python - tkinter 将滚动条放在 Canvas 上的底部位置

c# - 在集合初始值设定项中使用条件

database - 从哪里可以获得可用于免费软件的频率排序词典?

python - 如何使用元组访问深度嵌套的字典?

python - 一线树实现

python - Intellisense 不适用于 Visual Studio Code 中的 Unreal

Python Beautifulsoup : file. write(str) 方法获取 TypeError : write() argument must be str, 不是 BeautifulSoup

python - 使用迭代将旧字典中的值提取到新字典中

perl - 为什么 Autovivification 发生在 keys() 而不是 %{..} ?