有没有办法在追加后添加更多的字典? django

Posted

技术标签:

【中文标题】有没有办法在追加后添加更多的字典? django【英文标题】:is there a way to add in more dict after inside an append? django 【发布时间】:2018-01-08 23:27:18 【问题描述】:

如果标题有点难以理解,请道歉。 不太清楚如何在一行内解释它。

我想做的是……

其实我有这个代码

    output = []

    objs = Model.objects.filter(abc=abc) # this would return a some queryset
    for obj in objs:
        output.append(
            TITLE: obj.title,
            TYPE: obj.type,
            # I want to add something here which is kind of like, if `obj.type` is 'hello' then print obj.word
        )

    return output

例如,如果我的obj.type 是“你好”

我想要

        output.append(
            TITLE: obj.title,
            TYPE: obj.type,
            WORD: obj.word,
        )

如果我的obj.type 是“世界”

我想要

        output.append(
            TITLE: obj.title,
            TYPE: obj.type,
            NADA: obj.nada,
        )

我想过做一些事情,比如

    output = []

    objs = Model.objects.filter(abc=abc) # this would return a some queryset
    for obj in objs:
        if obj.type == 'hello':
            output.append(
                TITLE: obj.title,
                TYPE: obj.type,
                WORD: obj.word,
            )
        if obj.type == 'world':
            output.append(
                TITLE: obj.title,
                TYPE: obj.type,
                NADA: obj.nada,
            )
    return output

上面应该可以工作,但是如果有另一种更好的方法,我很想知道另一种方法,因为上面看起来太多余了。

提前感谢您的任何建议

【问题讨论】:

【参考方案1】:

好吧,你所拥有的似乎还不错,但如果你真的讨厌代码重复,你总是可以在 if first 之外创建字典。

output = []
objs = Model.objects.filter(abc=abc) # this would return a some queryset
for obj in objs:
    current_dict = 
        "TITLE": obj.title,
        "TYPE": obj.type,
    
    if obj.type == "world":
        current_dict["NADA"] = obj.nada
    else:
        current_dict["WORD"] = obj.world

    output.append(current_dict)

return output

但是您可能会放慢速度。(尽管不进行第二次检查可以赢得时间:P)

使用 timeit (https://docs.python.org/3/library/timeit.html) 来查看“漂亮的代码”是否值得花时间,也许它对您的用例没有太大变化。

另外,对于单线爱好者:

从 python 3.5 开始,就像 Pep 448 中建议的那样,您可以这样做:

return [
    
        **
            "TITLE": obj.title,
            "TYPE": obj.type
        ,
        **"NADA": obj.nada if obj.type == "word" else **"WORD": obj.word
     for obj in Model.objects.filter(abc=abc)
]

也可以放在一行中。 如果你真的喜欢简洁,那就是,但有些人会认为它比你所拥有的更糟糕。 ^-^

【讨论】:

能否请您降低 obj.Nada 情况,它伤害了我 pep8 的眼睛 :) 也应该是一个字 啊哈确实忙着编辑答案并试图理解无引号的字典。 > @Alceste_ 除了讨厌看到重复项之外,我认为会更快,特别是如果我有 15 个字段而不是只有两个字段。所以我之前所做的似乎更有可能让它有更好的时间表现? 嗯,你所做的是仔细检查类型,而你可以简单地做一个 if-else。所以时间可能不会有太大的不同。但是,如果您还使用 if-else 语句,则附加到 dict 可能会更慢。我的最后一种方法可能在后期 python 中得到了很好的优化,你应该尝试看看它是否能提供更好的结果。 (如果您不想使用 timeit,这对于小测试来说似乎很繁重,您可以使用 from time import clock 并在 startpoint 和 after 千次调用之间进行区分。) @Alceste_ Python 3.5 你的意思是:P【参考方案2】:
output = []

objs = Model.objects.filter(abc=abc)  # this would return a some queryset

for obj in objs:

    start_dict = 
        'TITLE': obj.title,
        'TYPE': obj.type
    

    if obj.type == 'hello':
        start_dict['WORD'] = obj.word
    elif obj.type == 'world':
        start_dict['NADA'] = obj.nada

    output.append(start_dict)

return output

【讨论】:

以上是关于有没有办法在追加后添加更多的字典? django的主要内容,如果未能解决你的问题,请参考以下文章

追加到 json 中转储的字典列表,而不用 python 加载列表

有没有办法在我的基于 django 的应用程序上打印字典键和相应的值列表?

在vfp表中如何使用命令(APPEND)追加后三个记录?

javascriptJQuery动态添加元素

关于GHOST的问题,高手来,有追加分

有没有办法在 nginx 上使用 django 上传一个非常大的文件?