首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中创建具有重复键的嵌套字典

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

Stack Overflow用户
提问于 2016-03-22 12:36:17
回答 3查看 3.5K关注 0票数 3

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

代码语言:javascript
复制
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']

目前,为了存储数据,我使用了额外的计数器键。

代码语言:javascript
复制
data = Autovivification()  
data[state][city][area][counter] = ID  

但是,在解析City/Area的总条目(重复项)时,我必须使用嵌套循环直到计数器键。

代码语言:javascript
复制
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发布的以下代码

代码语言:javascript
复制
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发布的代码。

代码语言:javascript
复制
class Dictlist(dict):  
    def __setitem__(self, key, value):  
        try:   
            self[key]   
        except KeyError:   
            super(Dictlist, self).__setitem__(key, [])   
        self[key].append(value)  

如何合并自动生成和复制类代码?或者有什么其他的仿生方法来处理这种情况呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-23 01:04:46

使用违约的另一个例子

代码语言:javascript
复制
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

如何获取所需项目的列表,使用此解决方案:

代码语言:javascript
复制
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']
票数 4
EN

Stack Overflow用户

发布于 2016-03-22 13:54:53

一种简单的方法是将它变成一个列表,然后将每个新键添加到列表中:

代码语言:javascript
复制
Data['State']['City']['Area'] = []
Data['State']['City']['Area'].append( ID )
票数 1
EN

Stack Overflow用户

发布于 2016-03-22 16:14:53

代码语言:javascript
复制
Data = {}


values = [
    dict(State="CA", City="San Francisco", Area="North", Id="customer1"),
    dict(State="CA", City="San Francisco", Area="Embarcadero", Id="customer1"),
    dict(State="CA", City="San Francisco", Area="North", Id="customer2"),

]

for v in values:
    #grab the existing entry.  if it doesn't exist, returns a list
    li = Data.setdefault((v["State"],v["City"],v["Area"]),[])
    li.append(v["Id"])

print "Data:%s" % (Data)

产出:

代码语言:javascript
复制
Data:{('CA', 'San Francisco', 'North'): ['customer1', 'customer2'], ('CA', 'San Francisco', 'Embarcadero'): ['customer1']}

您不局限于一个非常简单的Id值,您几乎可以将任何想要的东西添加到列表中。如果您希望在多个点执行此操作,请查看https://docs.python.org/2/library/collections.html#collections.defaultdict,它可以进行内置的设置默认设置。

实际上,您可以将ID添加到字典中而不是列表中,这都是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36154563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档