gpt4 book ai didi

python - 迭代时按键从字典中删除元素

转载 作者:行者123 更新时间:2023-11-30 22:36:42 26 4
gpt4 key购买 nike

为了从空值中过滤字典列表,我需要从字典中删除约 30% 的数据。

所以我最终得到了这段代码:

   qr = query_result
for row in qr:
for key, value in row.items():
if value ==' ' or value == None, value == '':
del row[key]

但是,第一次删除尝试执行期间出现错误:

运行时错误:字典在迭代期间更改了大小

在 stackoverflow 上进行一些搜索后,我发现 solution ,这涉及将所有已删除的值复制到单独的列表以供后续删除。

delete = []
for k,v in dict.items():
if v%2 == 1:
delete.append(k)
for i in delete:
del dict[i]

对于我的案例,这种方法会转换为这样的代码:

qr = query_result
for row in qr:
delete = []
for key, value in row.items():
if value == ' ' or value == '' or value == None:
delete.append(key)
for i in delete:
del row[i]

它也受到某些RuntimeError的影响。

因此,删除循环应该位于 dict foreach 循环之外:

qr = query_result
for row in qr:
delete = []
for key, value in row.items():
if value == ' ' or value == '' or value == None:
delete.append(key)
for i in delete:
del row[i]

但不幸的是,给定的代码仅正确修改了最后一行。

如何处理所有行然后删除垃圾数据?

以下是一些测试数据:

c = [{'A': 'B', 'C': '3', 'EE': None, 'P': '343', 'AD': ' ', 'B': ''},
{'A': 'B', 'C': '3', 'EE': None, 'P': '343', 'AD': ' ', 'B': ''}]

我的输出:

{'A': 'B', 'C': '3', 'EE': None, 'P': '343', 'AD': ' ', 'B': ''}
{'A': 'B', 'C': '3', 'P': '343'}

期望的输出:

{'A': 'B', 'C': '3', 'P': '343'}
{'A': 'B', 'C': '3', 'P': '343'}

最佳答案

这是修改您的第一个示例的版本,您需要“复制”您的列表以对其进行迭代并同时删除。迭代复制的列表后,您可以根据需要从原始列表中删除。

import copy

qr = [{'A': 'B', 'C': '3', 'EE': None, 'P': '343', 'AD': ' ', 'B': ''},
{'A': 'B', 'C': '3', 'EE': None, 'P': '343', 'AD': ' ', 'B': ''}]

for i, row in enumerate(copy.deepcopy(qr)):
for key, value in row.items():
if value in {' ', None, ''}:
del qr[i][key]

print(qr)

除此之外,通常您想要创建一个新列表而不是从原始列表中删除。一个简单的列表理解就可以解决问题:

qr = [{k:v for k, v in row.items() if v not in {' ', None, ''}} for row in qr]

print(qr) # same result

两者的输出:

[{'A': 'B', 'C': '3', 'P': '343'},
{'A': 'B', 'C': '3', 'P': '343'}]

关于python - 迭代时按键从字典中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com