有没有办法在追加内部后加入更多的dict? Django的

时间:2017-08-01 23:05:39

标签: python django list dictionary append

如果标题有点难以理解,请道歉。 不太确定如何在一条线内解释它。

我想做的是......

实际上我有这段代码

    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是'hello'

我想要

        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

上述应该有效,但如果还有其他更好的方法,我很想知道另一种做法,因为上述内容似乎过于冗余。

提前感谢任何建议

2 个答案:

答案 0 :(得分:4)

你所拥有的东西似乎没问题,但是如果你真的讨厌重复代码,你总是可以在第一个之外制作字典。

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)
]

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

答案 1 :(得分:0)

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