从词典中删除词条

2024-04-26 08:06:50 发布

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

我有一本字典。。在

self.books = {}
newbook = {'Quantity': '1', 'Price': '1.58',   'Id': '1006', 'Title': 'Book1', 'Status': 'Out'}

我添加的命令如下:

^{pr2}$

要显示所有帐簿条目:

for books in self.books.values():
    print("{0}".format(order))

{'Quantity': '3', 'Price': '7.56',   'Id': '1003', 'Title': 'To kill a  mock', 'Status':'In'}
{'Quantity': '7', 'Price': '2.9',   'Id': '1002', 'Title': 'LOTR', 'Status':'In'}
{'Quantity': '2', 'Price': '5.45',   'Id': '1001', 'Title': 'HPATFS', 'Status':'Out'}
{'Quantity': '12', 'Price': '11.57',   'Id': '1004', 'Title': 'Best book ever', 'Status':'Out'}

不幸的是,我不能根据Id、价格或状态删除图书条目?我试过del或pop,但条目仍然存在。在

for k, v in self.books.items():
    if k == books['Id']:
    # del self.books[k]
    self.books.pop(books['Id'], None)

Tags: inselfidfor字典titlestatus条目
1条回答
网友
1楼 · 发布于 2024-04-26 08:06:50

首先也是最重要的一点是,不能使用不确定是否唯一的值作为字典的键。字典是按关键字索引的,索引必须是唯一的。实际上,语言甚至不允许您尝试添加两个具有相同值的条目。添加第二项会覆盖第一项:

>>> d = {'a':1}
>>> d.update({'a':2})
>>> print(d)
{'a': 2}

因此,您肯定应该使用'Id'值作为字典的键,假设您的id实际上是唯一的。在

正因为如此,剩下的问题就归结为根据字典条目的值而不是键来查找字典条目。为此,您必须定义dict包含多个具有该值的条目时的行为。我假设你想要一个带有指定价格标签的所有ID的列表。在

对于这个问题,我唯一能想到的方法就是迭代dict:

^{pr2}$

(使用dic.iteritems()代替python2.X)

例如:

>>> d = {'k1':1,'k2':2,'k3':3, 'k4':2, 'k5':2}
>>> findKeysByValue(d,2)
['k5', 'k2', 'k4']

一旦知道感兴趣的书的键,就可以对该键应用所有字典操作。在

代码的最后一部分有两个不同的问题。首先,pop从字典中获取一个键作为参数,而不是值。另外,这段代码生成一个RuntimeError: dictionary changed size during iteration,因为您在字典本身上进行迭代,并在每个循环中删除一个项。您可以通过迭代您的dict副本来绕过这个问题,即:

copy_dict = self.books.copy()
for k in copy_dict:
  if k == books['Id']:
    self.books.pop(k, None)

根据self.books的大小,这可能不合适,因为您的空间需求是原来的两倍。在

相关问题 更多 >