70

我有一个字典列表,并且想为这个列表的每个元素添加一个键。我试过:

result = [ item.update({"elem":"value"}) for item in mylist ]

但是更新方法返回无,所以我的结果列表中全是无。

result = [ item["elem"]="value" for item in mylist ]

返回语法错误。

4

7 回答 7

81

如果您想使用列表理解,这里有一个很好的答案: https ://stackoverflow.com/a/3197365/4403872

在你的情况下,它会是这样的:

result = [dict(item, **{'elem':'value'}) for item in myList]

例如。:

myList = [{'a': 'A'}, {'b': 'B'}, {'c': 'C', 'cc': 'CC'}]

然后使用

result = [dict(item, **{'elem':'value'}) for item in myList]

或者

result = [dict(item, elem='value') for item in myList]

最后,

>>> result
[{'a': 'A', 'elem': 'value'},
 {'b': 'B', 'elem': 'value'},
 {'c': 'C', 'cc': 'CC', 'elem': 'value'}]
于 2016-01-13T02:40:48.497 回答
59

您无需担心构建新的字典列表,因为对更新字典的引用与对旧字典的引用相同:

 for item in mylist:
    item.update( {"elem":"value"})
于 2012-12-28T14:37:53.097 回答
13

你可以使用地图。

result = map(lambda item: dict(item, elem='value'), myList)

如果您已经有了元素列表,您可以执行以下操作:

#elements = ['value'] * len(myList)
result = map(lambda item: dict(item[0], elem=item[1]),zip(myList,elements))

那么你有结果

于 2017-07-16T12:22:22.800 回答
8

@vk1011 的回答很好,可以用扩展运算符简洁地扩展,新的字典对象是一个额外的好处

  1. 要使用新键覆盖任何现有键的值,您可以将扩展运算符放在新项目之前

    result = [{**item, 'elem':'value'} for item in myList]
    
  2. 要使用现有条目覆盖新条目的值,请在新条目之后使用扩展运算符

    result = [{'elem':'value', **item} for item in myList]
    

两种方法都会给出一个字典对象列表,包括新项目

于 2018-11-13T15:27:22.133 回答
6

传统上但比其他(复杂)答案更快:

myList = [{'a': 'A'}, {'b': 'B'}, {'c': 'C', 'cc': 'CC'}]
for item in myList: item['elem']='value'

一些时间:

%timeit result = [dict(item, **{'elem':'value'}) for item in myList]
865 ns ± 8.89 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit result = [dict(item, elem='value') for item in myList]
854 ns ± 5.37 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit result = list(map(lambda item: dict(item, elem='value'), myList))
1.22 µs ± 86.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit for item in myList: item.update({'elem':'value'})
464 ns ± 3.72 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit for item in myList: item['elem']='value'
124 ns ± 0.31 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit [dict(list(item.items()) + [("elem", "value")]) for item in myList]
1.59 µs ± 14.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
于 2021-05-11T15:08:09.010 回答
4
>>> a = [ { 1:1 }, {2:2}, {3:3} ]
>>> for item in a:
...     item.update( { "test": "test" } )
... 
>>> a
[{'test': 'test', 1: 1}, {'test': 'test', 2: 2}, {'test': 'test', 3: 3}]

您错误地使用了列表推导,调用item.update返回一个None值,因此您新创建的列表将充满None值而不是您的预期dict值。

您只需要遍历列表中的项目并相应地更新每个项目,因为列表包含对dict值的引用。

于 2012-12-28T14:37:32.720 回答
2

要么不使用列表推导,要么根据原始字典加上新键返回一个新字典:

[dict(list(item.items()) + [("elem", "value")]) for item in mylist]
于 2012-12-28T14:38:31.927 回答