从词典字典中删除条目

时间:2017-01-25 14:05:19

标签: 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))

{'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'}

很遗憾,我无法根据身份或价格或状态删除图书条目?我尝试过del或pop,但是这个条目仍然存在。

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

1 个答案:

答案 0 :(得分:0)

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

>>> 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()代替Python 2.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的大小,但这可能不合适,因为您的空间需求增加了一倍。