在列表的每个字典中添加一个元素(列表理解)
- 2025-04-01 09:56:00
- admin 原创
- 7
问题描述:
我有一个字典列表,想为该列表的每个元素添加一个键。我试过:
result = [ item.update({"elem":"value"}) for item in mylist ]
但是更新方法返回None,所以我的结果列表全是None。
result = [ item["elem"]="value" for item in mylist ]
返回语法错误。
解决方案 1:
如果您想使用列表理解,这里有一个很好的答案:
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'}]
解决方案 2:
您不需要担心构建新的字典列表,因为对更新后的字典的引用与对旧字典的引用相同:
for item in mylist:
item.update( {"elem":"value"})
解决方案 3:
传统上但比其他(复杂的)答案更快:
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)
解决方案 4:
@vk1011 的答案很好,可以用扩展运算符简洁地进行扩展,而新的字典对象则是额外的好处
要用新键覆盖任何现有键的值,可以将扩展运算符放在新项之前
result = [{**item, 'elem':'value'} for item in myList]
要用现有条目的值覆盖新条目的值,请在新条目后使用扩展运算符
result = [{'elem':'value', **item} for item in myList]
两种方法都会给出包含新项目的字典对象列表
解决方案 5:
您可以使用地图。
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))
然后你就得到了结果
解决方案 6:
>>> 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
值的引用。
解决方案 7:
要么不使用列表推导,要么根据原始字典加上新键返回一个新字典:
[dict(list(item.items()) + [("elem", "value")]) for item in mylist]
解决方案 8:
这可以通过|
连接字典来实现:
mylist = [ {"id": 1}, {"id": 2} ]
result = [ item | {"elem": "value"} for item in mylist ]
print(f"{result = }")
result = [{'id': 1, 'elem': 'value'}, {'id': 2, 'elem': 'value'}]
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD