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



我有一个问题,我想确定我的方法是否合理。这是这个想法:

我将创建一个名为 zip_codes 的主字典,其中各自的邮政编码(来自列表(是每个嵌套字典的名称。每个人都有"成员"、"办公室"、"每个办公室的成员"的键 它看起来像这样:

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

等等等等。

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

使用嵌套字典是最python的方法吗?很麻烦吗?有没有更好的方法?

有人可以给我一个关于如何将键值从循环推送到嵌套字典中的提示吗?我无法找到描述我正在尝试做什么的好资源(如果这确实是最好的路径(。

谢谢。

:编辑:一个更具体的例子:

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

:编辑 2:

疯狂物理学家要求我给出代码示例(我什至不知道从哪里开始,也找不到示例。到目前为止,我所能做的就是:

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:

还行。这很复杂(我的错(。请允许我进一步澄清:

因此,我有一个嵌套字典应该是什么样子的示例。它们一开始是空的,但我需要遍历其中一个邮政编码列表来创建所有嵌套的字典......拉链内侧。

这是我想用来在zips字典中创建嵌套字典的列表示例:

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

这就是我想要它的样子

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

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

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

一个我弄清楚第一部分,我可以自己弄清楚第二部分。

再次感谢。很抱歉有任何困惑。

你可以做这样的事情:

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的次数 代码存在于列表中(。

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

使用嵌套字典是最python的方法吗?是 很麻烦吗?有没有更好的方法?

我可以建议制作一个简单的对象来表示每个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

我建议您在拥有实际值时附加它,而不是为每个键使用空值初始化字典。你有键列表,我不明白为什么你想把它们都放到字典里而没有首先有价值。

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
}

希望这有帮助

最新更新