是否可以在不使用字典理解的情况下将字典的值与int进行比较?

时间:2019-03-01 02:42:07

标签: python dictionary

d = {}
d[3] = 0
d[1] = 4

我尝试了

mask = d > 1    # TypeError: '>' not supported between instances of 'dict' and 'int'
mask = d.values > 1    # TypeError: '>' not supported between instances of 'builtin_function_or_method' and 'int'

两者都不正确。是否可以在不使用字典理解的情况下执行计算?

所需的输出将是:

{3: False, 1: True}

2 个答案:

答案 0 :(得分:2)

我觉得您想要的是能够实际编写d < 5并神奇地获得新词典的能力(我认为普通dict()不可能做到)。但另一方面,我认为这是个好主意,因此我实施了第一个版本:

"""Here is our strategy for implementing this: 

 1) Inherit the abstract Mapping which define a 
 set of rules — interface — we will have to respect 
 to be considered a legitimate mapping class. 

 2) We will implement that by delegating all the hard 
 work to an inner dict().

 3) And we will finally add some methods to be able 
 to use comparison operators.
""" 
import collections
import operator

"Here is step 1)"
class MyDict(collections.abc.MutableMapping):

  "step 2)"
  def __init__(self, *args):
    self.content = dict(*args)

  # All kinds of delegation to the inner dict: 
  def __iter__(self): return iter(self.content.items())
  def __len__(self): return len(self.content)
  def __getitem__(self, key): return self.content[key]
  def __setitem__(self, key, value): self.content[key] = value
  def __delitem__(self, key): del self.content[key]
  def __str__(self): return str(self.content)

  "And finally, step 3)"
  # Build where function using the given comparison operator
  def _where_using(comparison):

    def where(self, other):
      # MyDict({...}) is optional
      # you could just decide to return a plain dict: {...}
      return MyDict({k: comparison(v, other) for k,v in self})

    return where

  # map all operators to the corresponding "where" method:
  __lt__ = _where_using(operator.lt)
  __le__ = _where_using(operator.le)
  __eq__ = _where_using(operator.eq)
  __gt__ = _where_using(operator.gt)
  __ge__ = _where_using(operator.ge)

我们可以按照您的要求使用它:

>>> d = MyDict({3:0, 1:4})
>>> print(d)
{3: 0, 1: 4}
>>> print(d > 1)
{3: False, 1: True}

请注意,这也适用于其他类型的(可比较)对象:

>>> d = MyDict({3:"abcd", 1:"abce"})
>>> print(d)
{3: 'abcd', 1: 'abce'}
>>> print(d > "abcd")
{3: False, 1: True}
>>> print(d > "abcc")
{3: True, 1: True}

答案 1 :(得分:1)

这是使用d<5之类的简单方法。您只需要:

import pandas as pd
res = pd.Series(d) < 4 
res.to_dict()  # returns {3: True, 1: False}`