删除值为空列表的字典的键

2024-09-21 05:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典,其中一些与键对应的值是空列表。我想删除所有这样的密钥

d = {'Receipt total': [], 'Total Amount (AED)': [], 'Grand total': [], 'Net Amount': [], 'Total': ['105.00'], 'Total (AED)': [], 'Total Invoice Amount': [], 'Invoice total': ['105.00'], 'Amount Due': ['0.00']}

预期产出:

d = {'Total': ['105.00'], 'Invoice total': ['105.00'], 'Amount Due': ['0.00']}

我试过:

for key, value in d.items():
    if value is None:
        del d[k]

我的代码不起作用


Tags: key列表fornet字典value密钥invoice
3条回答

您可以改为使用dictionary comprehension

d = {'Receipt total': [], 'Total Amount (AED)': [], 'Grand total': [], 'Net Amount': [], 'Total': ['105.00'], 'Total (AED)': [], 'Total Invoice Amount': [], 'Invoice total': ['105.00'], 'Amount Due': ['0.00']}
    
d = {k: v for k, v in d.items() if v != []}

print(d)

# d = {'Total': ['105.00'], 'Invoice total': ['105.00'], 'Amount Due': ['0.00']}

您可能需要显式检查该值是否为[]。否则,您可能会删除对False(“假”)求值的内容,例如,您可能不想要的0值。当然,这一点只有在dict可以包含列表以外的内容作为值时才相关

您可以这样使用字典理解:

d = {'Receipt total': [], 'Total Amount (AED)': [], 'Grand total': [], 'Net Amount': [], 'Total': ['105.00'], 'Total (AED)': [], 'Total Invoice Amount': [], 'Invoice total': ['105.00'], 'Amount Due': ['0.00']}

#use dictionary comprehensiion to create a new list of values where they value is not an empty list
d = {key : value for key, value in d.items() if len(value) != 0}

print(d)

输出:{'Total': ['105.00'], 'Invoice total': ['105.00'], 'Amount Due': ['0.00']}

通过使用for循环删除字典中的项,它将引发RuntimeError: dictionary changed size during iteration

你的思维至少有三个错误

第一个是空列表与None相同

只有NoneNone相同

其次,比较列表时,应该使用==。使用is来比较一个列表意味着,即使列表中有相同的值,如果它不是实际相同的内存地址,它也不会进行相等的比较

另外,由于您只想知道列表是否为空,因此可以使用以下事实:在Python中,空序列被视为False,非空序列被视为True,因此您可以使用布尔条件:if not value:,它将是空列表的True。如果值可以不是列表,那么空字符串、零等也都是False,所以您可能需要更仔细地检查

第三,在对容器进行迭代时,不应修改容器的大小,如dict。 可以对其副本进行迭代,也可以创建要修改的内容的记录,然后执行修改

第一种方法是在副本上迭代:

for key, value in list(d.items()):
    if not value:
        del d[key]

第二种方法,制作一组要移除的键:

keys_to_remove = {key for key, value in d.items()
                  if not value}

for key in keys_to_remove:
    del d[key]

相关问题 更多 >

    热门问题