Python 在列表中对元组的两个元素进行排序,忽略大小写,以便字典的键正确对齐
我正在迭代同一类的两个实例,以检查是否相等。这个类的这两个实例是通过不同的方式创建的:一个来自pickle,另一个来自json文档 我正在迭代这些对象的属性,以检查是否相等,但是,字典中的键并不总是对齐的,因此无法正确比较它们。所以我尝试对这些元组进行排序,但由于区分大小写,我无法始终从这两个对象中获得相同的键 一次尝试给了我左侧排序: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
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()
的注释。还有别的吗?我会在这里多呆一会儿;)