【问题标题】:if key, value pair exist in a dictionary skip python如果字典中存在键,值对跳过python
【发布时间】:2016-03-05 00:26:08
【问题描述】:

我有两个变量要使用collections.defaultdict(list) 添加到字典中 这是两个变量:

score = [0, 5, 7, 7, 8, 7]
match = ['turtle', 'cat', 'horse', 'horse', 'dog', 'bear']

我想做的是删除字典中已经存在的键/值对。现在我正在使用这种方法创建我的字典:

  scoring = collections.defaultdict(list)
  scoring[score].append(match)

但是,这种方法给了我一个像这样的字典:

dictionary = {0: ['turtle'], 5: ['cat'], 7: ['horse', 'horse', 'bear'], 8: ['dog']}

但是,我只希望 horse 在字典中出现一次。有没有办法防止以这种方式在字典中添加相同的键/值对?

【问题讨论】:

  • 如果您不关心订购,您可以使用套装。只需将 defaultdict 参数更改为 set 并将方法从 list.append 更改为 set.add
  • .... 或在 defaultdict(list) 之外使用第二个 defaultdict(set) 来查看已添加的元素。

标签: python dictionary


【解决方案1】:

您可以使用set() 而不是list 来保留这些值:

>>> coring = defaultdict(set)
>>> for i,j in zip(score, match):
...     coring[i].add(j)
... 
>>> coring
defaultdict(<type 'set'>, {0: set(['turtle']), 8: set(['dog']), 5: set(['cat']), 7: set(['horse', 'bear'])})
>>> 

由于set 对象不保留顺序,如果您关心值项的顺序,可以使用OrdereDict 作为值容器:

>>> from collections import defaultdict, OrderedDict
>>> coring = defaultdict(OrderedDict)
>>> 
>>> for i,j in zip(score, match):
...     coring[i][j]=None
... 
>>> coring
defaultdict(<class 'collections.OrderedDict'>, {0: OrderedDict([('turtle', None)]), 8: OrderedDict([('dog', None)]), 5: OrderedDict([('cat', None)]), 7: OrderedDict([('horse', None), ('bear', None)])})
>>> 
>>> coring[7]
OrderedDict([('horse', None), ('bear', None)])
>>> coring[7].keys()
['horse', 'bear']

【讨论】:

  • 值的顺序是什么意思?这是否意味着{7: ['horse', 'bear']}{7: ['bear', 'horse']} 之间没有区别?是这样,那无所谓。
  • @interstellar 我的意思是值的项目。如果它不重要,那么您可以简单地使用第一种方法。
  • 好的。我想我明白你在说什么。值的顺序无关紧要,最终我还是会根据键对字典进行排序。谢谢!!
【解决方案2】:

如果您想继续使用列表而不是集合,请进行过滤:

>>> d = defaultdict(list)
>>> for k,v in zip(score, match):
        if k not in d or v not in d[k]:
            d[k].append(v)


>>> d
defaultdict(<class 'list'>, {0: ['turtle'], 8: ['dog'], 5: ['cat'], 7: ['horse', 'bear']})

【讨论】:

  • 我也喜欢你的方法。谢谢!
  • 当然@interstellar .. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2022-08-05
  • 1970-01-01
相关资源
最近更新 更多