【问题标题】:is there a way to add in more dict after inside an append? django有没有办法在追加后添加更多的字典? 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

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

提前感谢您的任何建议

【问题讨论】:

    标签: python django list dictionary append


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      相关资源
      最近更新 更多