python - 在 Python 中从 OrderedDict 访问数据并对其进行循环

标签 python django dictionary ordereddictionary

我的 Django 应用程序中有一个 OrderedDict,它可以为每个版本获取 content editioncontent subversions

看起来像这样:

from collections import OrderedDict
od = OrderedDict()

for version in list_of_edition():
    od.setdefault((version.pk, version.title), []).extend([(subversion.pk, subversion.title) for subversion in version.collection.all()])

我得到:

OrderedDict([((2, '10th Edition (Current)'), [(58464, 'Ph. Eur. 10.0 lite')]), ((1, '9th Edition'), [(21928, 'Ph. Eur. 9.8 lite'), (29235, 'Ph. Eur. 9.9 lite'), (36542, 'Ph. Eur. 9.10 lite')])])

# Rewritten in order to get more readable
OrderedDict(
    [
        (
            (2, '10th Edition (Current)', True), [(58464, 'Ph. Eur. 10.0 lite')]
        ),
        (
            (1, '9th Edition', True), [(21928, 'Ph. Eur. 9.8 lite'), (29235, 'Ph. Eur. 9.9 lite'), (36542, 'Ph. Eur. 9.10 lite')]
        )
    ]
)

这个 OrderedDict 让我可以在导航栏菜单中创建用于导航的选项卡。 应该是:

Tab : 10th Edition (Current) 
    |
    ---> subtab : Ph. Eur. 10.0 lite

Tab : 9th Edition
    |
    ---> subtab : Ph. Eur. 9.8 lite
    |
    ---> subtab : Ph. Eur. 9.9 lite
    |
    ---> subtab : Ph. Eur. 9.10 lite

在我的menu.py 文件中,菜单是这样创建的:

content_children = (
    AdminMenuItem(_('Manage smth1'), reverse('smth1-list'), weight=100, separator=False),
    AdminMenuItem(_('Manage smth2'), reverse('smth2-list'), weight=100, separator=False),
    ...
)

Menu.add_item('content', MenuItem(_('Content'), '#content', children=content_children)

因此,我尝试遍历 OrderedDict,以便像之前的示例一样创建我的菜单。我在隔离每个菜单并为每个关联的菜单添加子菜单时遇到了一些困难:

edition_children = ()
for version in od:
    for element in od[version]:
        edition_children += MenuItem(element[1], reverse('home'), weight=150, separator=False),

for version in od:
    Menu.add_item('edition', MenuItem(version[1], '#', children=edition_children))

它给了我:

enter image description here

第 9 版 也是如此。对于 第 10 版,我应该只有 博士学位。欧元。 10.x第 9 版,我应该只有 Ph.欧元。 9.x

非常感谢你提前

最佳答案

您正在构建所有子版本的列表,然后将该列表添加到所有版本。

像这样重新安排你的循环:

for version in od:
    edition_children = ()
    for element in od[version]:
        edition_children += MenuItem(element[1], reverse('home'), weight=150, separator=False),
    Menu.add_item('edition', MenuItem(version[1], '#', children=edition_children))

关于python - 在 Python 中从 OrderedDict 访问数据并对其进行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56222242/

相关文章:

python-3.x - 使用 boto3 : "' dict' object has no attribute 'put' "将字符串写入 S3

python - 将值分配给嵌套字典错误

python - 将 float 列表写入 csv 文件

python - 在 Blender 中创建拼图球体的方法是什么?

python - Python args 和 kwargs 在实践中是否曾经命名过其他东西?

python - 如何在屏幕上显示 PIL 图像?

django - 使用 django.contrib.auth,如何让用户知道登录失败的原因?

python - 使用查询数据库的默认字段函数迁移时出现 Django 错误

python - PIL/JPEG 库 : "decoder jpeg not available"

c# - 使用 LINQ 将复杂对象映射到字典