【问题标题】:make list of dictionaries overwriting one key entry from a list using iterators使用迭代器制作字典列表覆盖列表中的一个键条目
【发布时间】:2020-12-09 09:57:22
【问题描述】:

我有一种可怕的感觉,这将是重复的,我已经尽力找到答案了。

我有一个字典和一个列表,我想创建一个字典列表,使用该列表覆盖其中一个键值,如下所示:

d={"a":1,"b":10}      
c=[3,4,5] 
arg=[]
for i in c:
    e=d.copy()
    e["a"]=i
    arg.append(e)

这给出了想要的结果

arg
[{'a': 3, 'b': 10}, {'a': 4, 'b': 10}, {'a': 5, 'b': 10}]

但代码很难看,尤其是使用复制命令时,在我的实际示例中,我有 4 或 5 个列表,而不是一个列表,这会导致一个巨大的嵌套循环。我确信有一个像迭代器这样的更简洁的方法

arg=[d *with* d[a]=i for i in c] 

我不知道用什么来代替“with”。

再次,如果已经回答,我们深表歉意。

【问题讨论】:

    标签: python iterator dictionary-comprehension


    【解决方案1】:

    IIUC,你可以这样做:

    d={"a":1,"b":10}
    c=[3,4,5]
    
    res = [{ **d, "a" : ci } for ci in c]
    print(res)
    

    输出

    [{'a': 3, 'b': 10}, {'a': 4, 'b': 10}, {'a': 5, 'b': 10}]
    

    部分:

    "a" : ci
    

    重写键 "a" 的值,**d 解包字典。

    【讨论】:

    • 不知道开箱的事,非常感谢
    • 顺便说一句:在 Python 3.9 中有新方法 d | {"a": ci} - res = [ d | {"a": ci} for ci in c]
    • @furas,很好,值得完整回答
    【解决方案2】:

    我会这样做:

    arg=[d.copy() for i in range(len(c))]
    for i in range(len(arg)):
        arg[i]['a']=c[i]
    

    此代码首先创建一个长度为 c 的字典列表,然后更新每个字典的 'a',其各自的 itme 为 c

    【讨论】:

      【解决方案3】:

      您可以在列表推导中使用字典推导,检查 key == 'a':

      d = {"a":1,"b":10}
      c = [3,4,5]
      l = [{k: num if k == 'a' else v for k,v in d.items()} for num in c]
      

      【讨论】:

        【解决方案4】:

        在 Python 3.9 中,有一种新方法可以创建具有更新值的新字典并保留旧字典而不更新 - 使用运算符 |

        new_dict = old_dict | dict_with_updates
        

        使用列表理解将是

        arg = [ d | {"a": i} for i in c]
        

        完整示例

        d = {"a": 1, "b": 10}
        c = [3, 4, 5]
        
        arg = [ d | {"a": i} for i in c]
        
        print(arg)
        

        顺便说一句:还有|=来更新现有字典

        old_dict |= dict_with_updates
        

        文档:What’s New In Python 3.9

        【讨论】:

        • 这太棒了,我们的系统从 3.6 更新后会立即试用
        猜你喜欢
        • 2013-01-26
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 2020-01-05
        • 2017-09-26
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多