代码之家  ›  专栏  ›  技术社区  ›  Honza S.

在列表理解中更新词典

  •  0
  • Honza S.  · 技术社区  · 9 月前

    有一本词典:

    d = [{"a":1, "b":2},{"a":3, "b":4},{"a":5, "b":6}]
    

    我想更新密钥的值 b .

    d = [{**m}.update({"b":5}) for m in d]
    

    但我不明白为什么 d = [None, None, None]

    我想 d = [{"a":1, "b":5},{"a":3, "b":5},{"a":5, "b":5}]

    4 回复  |  直到 9 月前
        1
  •  5
  •   David    9 月前

    dict.update 退货 None 并更新 dict 到位 。您可以尝试使用 | 返回新的运算符 字典 :

    d = [m | {"b":5} for m in d]
    
        2
  •  2
  •   chepner    9 月前

    你应该使用常规 for 循环应用 update 每个现有 dict ,不创建新的列表 字典 s

    list_of_d = [{"a":1, "b":2},{"a":3, "b":4},{"a":5, "b":6}]
    
    for d in list_of_d:
        d.update(b=5)
    

    列表理解不仅仅是“一行” 对于 循环”。


    因为 更新 在原地修改对象时,您 能够 使用列表理解和 忽视 结果列表,但我不建议这样做。你不想要一个列表 None 值,你不应该仅仅为了副作用而创建它 d.update .

    >>> list_of_d = [{"a":1, "b":2},{"a":3, "b":4},{"a":5, "b":6}]
    >>> [d.update(b=5) for d in list_of_d]
    [None, None, None]
    >>> list_of_d
    [{'a': 1, 'b': 5}, {'a': 3, 'b': 5}, {'a': 5, 'b': 5}]
    
        3
  •  1
  •   setinaz foroudi    9 月前

    你遇到的问题是因为Python中的update()方法不返回更新的字典。相反,它返回None。这就是为什么当你在这样的列表理解中使用update()时,它会产生一个None值的列表。

    以下是修正后的方法:

    d = [{**m, "b": 5} for m in d]
    

    此代码为列表d中的每个元素创建一个新字典,将键“b”的值更新为5,同时保留其他键值对。

    因此,通过这种方法,d将正确地为:

    d = [{"a":1, "b":5},{"a":3, "b":5},{"a":5, "b":5}]
    
        4
  •  0
  •   Beaudry Chase    9 月前

    你得到的原因 d = [None, None, None] 是因为 dict.update 不返回任何值。一般来说,建议避免使用列表理解对元素产生副作用,因为读者在试图理解意图时可能会绊倒。这可能是内置的一个用例 map 功能。

    d = [{"a":1, "b":2},{"a":3, "b":4},{"a":5, "b":6}]
    
    list(map(lambda x: x.update({"b":5}), d))
    
    # Elements of d are now updated
    
    

    但我认为,一般来说,在处理可迭代对象时,如果你调用的函数对元素有理想的副作用,那么使用for循环是最干净的。

    d = [{"a":1, "b":2},{"a":3, "b":4},{"a":5, "b":6}]
    
    for x in d:
        x.update({"b":5},d)