将列表项迭代到嵌套字典中的大多数pythonic方法

时间:2019-09-10 22:22:46

标签: python dictionary

我有问题,我想确定我的方法是否正确。这是想法:

我将创建一个称为zip_codes的主字典,其中每个邮政编码(从列表中)分别是每个嵌套字典的名称。每个都将具有“成员”,“办公室”,“每个办公室成员”的密钥 看起来像这样:

zips {
    90219: {
      "members": 120,
      "offices": 18,
      "membersperoffice": 28
    },
    90220: {
      "members": 423,
      "offices": 37,
      "membersperoffice": 16
    }
}

以此类推。

我认为我需要构建嵌套字典,然后根据条件处理多个列表,将结果值即时传递到相应的字典中(即,基于列表中邮政编码的数量)。

使用嵌套字典是执行此操作最有效的方法吗?麻烦吗?有更好的方法吗?

有人可以给我一个关于如何将关键值从循环中推入嵌套字典的提示吗?我找不到能够描述我要做什么的好资源(如果确实是最好的方法)。

谢谢。

:edit:一个更具体的例子:

  1. 确定在名为“ membersperzip”的列表中有多少个邮政编码实例
  2. 在名为zips的字典中找到与邮政编码相同名称的对应嵌套字典
  3. 将值传递给相应的键,称为“成员”(或其他键)

:编辑2:

MadPhysicist请求我提供代码示例(我什至不知道从哪里开始,也找不到示例。到目前为止,我所能做的就是:

area_dict = {}

area_dict = dict.fromkeys(all_areas, 0)  #make all of the zipscodes keys, add a zero in the first non-key index

dictkeys = list (area_dict.keys())

这使我成为一堆以邮政编码为键的字典。我发现没有办法遍历列表并创建嵌套字典(尚未)。因此,实际的问题。

请不要打扰我,并执行通常的堆栈溢出操作。这不是我要任何人做作业。这只是我要某人给我的提示。

:编辑3:

好的。这令人费解(我的错)。请允许我进一步澄清:

因此,我有一个嵌套字典应该是什么样的示例。他们将开始是空的,但我需要遍历一个邮政编码列表以创建所有嵌套的字典……在zip内。

这是我要用于在zip字典内部创建嵌套字典的列表的示例:

zips = [90272, 90049, 90401, 90402, 90403, 90404, 90291, 90292, 90290, 90094, 90066, 90025, 90064, 90073]

这就是我想要的样子

zips {
    90272: {
      "members": ,
      "offices": ,
      "membersperoffice": 
    },
    90049: {
      "members": ,
      "offices": ,
      "membersperoffice": 
    }
}

... 等等(为列表中的每个邮政编码创建一个对应的嵌套字典)

完成此操作后,我必须遍历其他几个邮政编码列表,这些列表会吐出邮政编码在给定列表中出现的次数,然后在中找到与该邮政编码相对应的字典。问题,然后将该值附加到相关键中。

我想出第一部分,我可以自己解决第二部分。

再次感谢。抱歉造成任何混乱。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

all_areas = [90219, 90220]

zips = {zipcode: code_members(zipcode) for zipcode in all_areas}

def code_members(zipcode):
    if zipcode == 90219:
        return dict(members=120, offices=18, membersperoffice=28)
    return dict(members=423, offices=37, membersperoffice=16)

  

我认为我需要构建嵌套的字典,然后处理几个   针对条件列表,将结果值传递给   对应的动态字典(,即基于zip的次数   代码存在于列表中)。

使用上述方法,如果zipcode列表中多次出现all_areas,则生成的zip词典将仅包含zipcode的一个实例。

  

使用嵌套字典是执行此操作最有效的方法吗?是   麻烦吗?有更好的方法吗?

我可以建议创建一个简单的对象来表示每个zipcode的值。简单的东西:

使用数据类:

@dataclass.dataclass
class ZipProperties(object):
    members: int
    offices: int
    membersperoffice: int

使用命名元组:

ZipProperties = collections.namedtuple('ZipProperties', ['members', 'offices', 'membersperoffice'])

然后您可以将code_members函数更改为此:

def code_members(zipcode):
    if zipcode == 90219:
        return ZipProperties(120, 18, 28)
    return ZipProperties(423, 37, 16)

解决您的具体示例:

  1. 确定在名为“ membersperzip”的列表中有多少个邮政编码实例
  2. 在名为zips的字典中找到与邮政编码相同名称的对应嵌套字典
  3. 将值传递给相应的键,称为“成员”(或其他键)
membersperzip: typings.List[Tuple[int, int]] = [(90219, 54)]

for zip, members in membersperzip:
    for zipcode, props in zips.items():
        if zipcode == zip:
            props.members = members

答案 1 :(得分:1)

我建议您在有实际值时附加它,而不是用每个键的空值初始化字典。您有键列表,但我不明白为什么要把所有键都放在字典中而不首先放在值上。

zips = [90272, 90049, 90401, 90402, 90403, 90404, 90291, 90292, 90290, 90094, 90066, 90025, 90064, 90073]
zips_dict = {}
for a_zip in zips:
    if a_zip not in zips_dict:
        # Initialize proper value here for members etc.
        zips_dict[a_zip] = proper_value

如果您坚持使用每个键的空值来初始化dict,则可以使用它,它也将以list的方式遍历python

zips = [90272, 90049, 90401, 90402, 90403, 90404, 90291, 90292, 90290, 90094, 90066, 90025, 90064, 90073]
zips_dict = {
   x:{
       "members":None,
       "offices":None,
       "membersperoffice":None,
   } for x in zips
}

希望这会有所帮助