Python 从词典中删除条目

Python 从词典中删除条目,python,dictionary,Python,Dictionary,我有一本词典 self.books = {} newbook = {'Quantity': '1', 'Price': '1.58', 'Id': '1006', 'Title': 'Book1', 'Status': 'Out'} 我添加如下命令: self.books[newbook['Price']] = newbook 要显示所有图书条目,请执行以下操作: for books in self.books.values(): print("{0}".format(order

我有一本词典

self.books = {}
newbook = {'Quantity': '1', 'Price': '1.58',   'Id': '1006', 'Title': 'Book1', 'Status': 'Out'}
我添加如下命令:

self.books[newbook['Price']] = newbook
要显示所有图书条目,请执行以下操作:

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)

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

>>> d = {'a':1}
>>> d.update({'a':2})
>>> print(d)
{'a': 2}
因此,您肯定应该使用
'Id'
值作为字典的键,假设您的Id实际上是唯一的

因此,问题的其余部分归结为通过字典条目的值而不是键来查找字典条目。为此,必须定义dict包含多个具有该值的条目时的行为。我假设您想要一个具有指定价格标签的所有ID的列表

我能想到的解释多个条目具有相同值的可能性的唯一方法是在dict上迭代:

def findKeysByValue(dic, value):
  match_keys = []
  for key, val in dic.items():
    if val == value:
      match_keys.append(key)
  return match_keys
(使用
dic.iteritems()
代替Python2.X)

例如,它产生:

>>> d = {'k1':1,'k2':2,'k3':3, 'k4':2, 'k5':2}
>>> findKeysByValue(d,2)
['k5', 'k2', 'k4']
一旦你知道你感兴趣的书的键,你就可以对该键应用所有字典操作

代码的最后一部分有两个不同的问题。首先,
pop
将字典中的键作为参数,而不是值。此外,此代码还会生成一个
运行时错误:在迭代过程中更改了字典的大小,因为您迭代字典本身并在每个循环中删除一个项。您可以通过迭代您的dict副本来规避此问题,即:

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

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

您正在按价格键入词典:
self.book[newbook['price']]=..
。你必须再次使用同一把钥匙。您的
k
将永远不会等于
neworder['OrderId']
,因为您的密钥是价格,而不是订单ID。请稍候。。。你用价格作为关键?如果有两本书价格相同怎么办?那么您只能持有一本书?为什么不使用
'Id'
值作为键?然后,您可以不循环地执行self.orderbook.pop(neworder['OrderId',None)
。这是一个交换商店实现。如果两本书的价格相同或接近相同的价格,那么您可以交换这些书。所以我想按价格列出并排序。但附加功能指定您可以在添加书籍后将其删除。。因此,如果我添加一本书a 1.99,然后决定删除它,我不想删除所有1.99的书。除非,我可以用“Id”键创建dicts,但是我可以搜索书的价格,如果两个价格匹配,根据Id执行交换吗?好的,如果我更改它,使我有一个Id键,那么我可以根据该Id删除。但是我得到了一个错误“字典在迭代过程中改变了大小”。我编辑了我的答案以回答你问题的最后一部分。谢谢。修改后的dict版本很有魅力。