Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表中对元组的两个元素进行排序,忽略大小写,以便字典的键正确对齐_Python_List_Dictionary_Tuples_Equality - Fatal编程技术网

Python 在列表中对元组的两个元素进行排序,忽略大小写,以便字典的键正确对齐

Python 在列表中对元组的两个元素进行排序,忽略大小写,以便字典的键正确对齐,python,list,dictionary,tuples,equality,Python,List,Dictionary,Tuples,Equality,我正在迭代同一类的两个实例,以检查是否相等。这个类的这两个实例是通过不同的方式创建的:一个来自pickle,另一个来自json文档 我正在迭代这些对象的属性,以检查是否相等,但是,字典中的键并不总是对齐的,因此无法正确比较它们。所以我尝试对这些元组进行排序,但由于区分大小写,我无法始终从这两个对象中获得相同的键 一次尝试给了我左侧排序: def __eq__(self, other): for (self_key, other_key) in sorted( zip(s

我正在迭代同一类的两个实例,以检查是否相等。这个类的这两个实例是通过不同的方式创建的:一个来自pickle,另一个来自json文档

我正在迭代这些对象的属性,以检查是否相等,但是,字典中的键并不总是对齐的,因此无法正确比较它们。所以我尝试对这些元组进行排序,但由于区分大小写,我无法始终从这两个对象中获得相同的键

一次尝试给了我左侧排序:

def __eq__(self, other):
    for (self_key, other_key) in sorted(
         zip(self.__dict__, other.__dict__),
         key=lambda element: (element[0].lower(), element[1].lower())):            
            print self_key, " ", other_key
      ....
哪个输出

alpha   VAR_THRESH
chunksize   VAR_MAXITER
decay   decay
....
如果我只显式地使右边
lower()

  ....
   key=lambda element: (element[0], element[1].lower())):
  ....
左侧不按“下”排序

VAR_MAXITER   alpha
VAR_THRESH   chunksize
alpha   VAR_THRESH
chunksize   VAR_MAXITER
decay   decay
如果我在这两个元素上都省略了
.lower()
,则得到第二个示例

如何确保正确的钥匙始终对齐?或者换句话说,我如何在元组中按两个值排序,忽略大小写,使它们始终对齐?

zip()
将为您提供给它的每个iterable中的相应元素。排序
zip()
返回的内容对您没有帮助。在将密钥传递到
zip()
之前,需要对密钥进行排序。不过,那真的不是你想要的。只要这样做:

def __eq__(self, other):
    if self.__dict__.viewkeys() != other_keys.__dict__.viewkeys(): # .keys() in Python 3
        return False
    return all(other.__dict__[key] == self.__dict__[key] for key in self.__dict__)
简单的方法是:

def __eq__(self, other):
    self.__dict__ == other.__dict__
但是,第一种方法可以更容易地更改,以定义什么是等效的

以下内容(由Padraic Cunningham提出)更接近您的要求:

def __eq__(self, other):
    return all(
        sorted(v) == sorted(self.__dict__[key])
            if isinstance(v, np.array)
        else self.__dict__[key] == v
        for key, v in other.__dict__.iteritems()
    )
这是一个快捷方式:

def __eq__(self, other):
    for key, v in other.__dict__.iteritems(): # .items() in Python 3
        if isinstance(v, np.array) and sorted(v) != sorted(self.__dict__[key]):
                return False
        elif self.__dict__[key] != v:
            return False
    return True

字典天生就是无序的。将密钥强制为符合特定定义的某种顺序当然是可能的,但也完全没有必要。您可以尝试以下方法:

def __eq__(self, other):

  # first, check to make sure that the two sets of keys are identical
  if self.__dict__.keys() != other.__dict__.keys():
    return False

  # now that we know the dictionaries have identical key sets, check
  # for equality of values.
  for key in self.__dict__.keys():
    if self.__dict__[key] != other.__dict__[key]:
      return False

  # if everything worked, then the dictionaries are identical!
  return True

顺序是不相关的,如果dict具有相同的对象,它们将比较equalI,则需要迭代dict的键,因为其中一个值是np数组。您在编辑之前的回答帮助我得到了正确的答案,但如果您将其还原,我将接受。@nook:好的;我回滚。
如果d2.keys()!=d1.keys()
足够,或者如果d2.viewkeys()!=d1,viewkeys()
对于python2,无需设置。在这种情况下,您将使用viewkeys,因为我从print语句中认为,OP使用的是python2,它应该比比较列表快。@PadraicCunningham:好;我已将其更改为使用
.viewkeys()
,并添加了关于
.keys()
的注释。还有别的吗?我会在这里多呆一会儿;)