如何从Python字典列表中移除指定键值匹配的元素?
问题描述
我有一个字典列表test_list,通过以下代码可查看其内容:
for i, d in enumerate(test_list): print(i, d) # 输出结果 0 {'role': None, 'content': 'Closing the gap between actual and potential crop yields', 'bounding_regions': [{'page_number': 1, 'polygon': [{'x': 4.2076, 'y': 9.019}, {'x': 7.5767, 'y': 9.019}, {'x': 7.5767, 'y': 9.387}, {'x': 4.2076, 'y': 9.387}]}], 'spans': [{'offset': 3482, 'length': 56}]} 1 {'role': None, 'content': 'Increasing realized yields per area requires both increasing the maximum possible regional yield for a given crop in the absence of biotic or abiotic stress (yield potential [Yp];', 'bounding_regions': [{'page_number': 1, 'polygon': [{'x': 4.2066, 'y': 9.4723}, {'x': 7.6041, 'y': 9.4723}, {'x': 7.6041, 'y': 9.9493}, {'x': 4.2066, 'y': 9.9493}]}], 'spans': [{'offset': 3539, 'length': 179}]} 2 {'role': None, 'content': 'Downloaded from https://academic.oup.com/plphys/article/185/1/34/6149974 by guest on 16 June 2023', 'bounding_regions': [{'page_number': 1, 'polygon': [{'x': 7.9365, 'y': 2.8965}, {'x': 8.0406, 'y': 2.8965}, {'x': 8.0406, 'y': 7.9632}, {'x': 7.9365, 'y': 7.9632}]}], 'spans': [{'offset': 3719, 'length': 97}]} 3 {'role': 'pageFooter', 'content': 'Received August 14, 2020. Accepted October 3, 2020. Advance access publication 19 November 2020 VC American Society of Plant Biologists 2021. All rights reserved. For permissions, please email: journals.permissions@oup.com', 'bounding_regions': [{'page_number': 1, 'polygon': [{'x': 0.5499, 'y': 10.1762}, {'x': 4.8923, 'y': 10.1762}, {'x': 4.8923, 'y': 10.3865}, {'x': 0.5499, 'y': 10.3865}]}], 'spans': [{'offset': 3817, 'length': 222}]}
需要移除列表中所有d['role'] == 'pageFooter'的元素,处理后预期输出:
0 {'role': None, 'content': 'Closing the gap between actual and potential crop yields', 'bounding_regions': [{'page_number': 1, 'polygon': [{'x': 4.2076, 'y': 9.019}, {'x': 7.5767, 'y': 9.019}, {'x': 7.5767, 'y': 9.387}, {'x': 4.2076, 'y': 9.387}]}], 'spans': [{'offset': 3482, 'length': 56}]} 1 {'role': None, 'content': 'Increasing realized yields per area requires both increasing the maximum possible regional yield for a given crop in the absence of biotic or abiotic stress (yield potential [Yp];', 'bounding_regions': [{'page_number': 1, 'polygon': [{'x': 4.2066, 'y': 9.4723}, {'x': 7.6041, 'y': 9.4723}, {'x': 7.6041, 'y': 9.9493}, {'x': 4.2066, 'y': 9.9493}]}], 'spans': [{'offset': 3539, 'length': 179}]} 2 {'role': None, 'content': 'Downloaded from https://academic.oup.com/plphys/article/185/1/34/6149974 by guest on 16 June 2023', 'bounding_regions': [{'page_number': 1, 'polygon': [{'x': 7.9365, 'y': 2.8965}, {'x': 8.0406, 'y': 2.8965}, {'x': 8.0406, 'y': 7.9632}, {'x': 7.9365, 'y': 7.9632}]}], 'spans': [{'offset': 3719, 'length': 97}]}
同时需要处理数千条数据,需保证执行效率。
高效解决方案
方法1:列表推导式(推荐)
列表推导式是Python中处理过滤操作最简洁高效的方式之一,底层由C实现,速度优于手动循环:
test_list = [d for d in test_list if d.get('role') != 'pageFooter']
使用d.get('role')而非直接d['role'],可避免因字典缺少role键引发的KeyError,容错性更强。如果确认所有字典都包含role键,也可以直接写d['role'] != 'pageFooter',速度会略快。
方法2:原地过滤(节省内存)
如果数据量极大,不想创建新列表占用额外内存,可通过反向遍历删除元素(正向遍历删除会导致索引错位):
for i in range(len(test_list)-1, -1, -1): if test_list[i].get('role') == 'pageFooter': del test_list[i]
这种方式在原列表上直接修改,内存占用更低,但执行速度略逊于列表推导式(涉及多次删除操作),适合内存紧张的场景。
方法3:filter()函数
结合lambda表达式使用filter()函数也能实现过滤,返回迭代器后可转为列表:
test_list = list(filter(lambda d: d.get('role') != 'pageFooter', test_list))
效率略低于列表推导式,但代码风格更偏向函数式编程,适合习惯该风格的场景。
验证结果
处理后可通过原遍历代码验证输出:
for i, d in enumerate(test_list): print(i, d)
输出会符合预期,所有role为pageFooter的元素已被移除。
内容的提问来源于stack exchange,提问作者stackword_0
相关产品推荐
相关产品推荐

