Python 作为dict键插入后,某些对象不';我没有出现在钥匙列表中 问题描述
我想用一个对象作为字典中的键。我想用来比较键的字典属性有:Python 作为dict键插入后,某些对象不';我没有出现在钥匙列表中 问题描述,python,object,dictionary,hash,Python,Object,Dictionary,Hash,我想用一个对象作为字典中的键。我想用来比较键的字典属性有:DDATE、WEEK\u PERIOD、DPERIOD、RPERIOD、ALLIANCE、DTIME、RTIME。我想排除属性DCXR、RCXR、DCNX、RCNX 算法的输出应为: AC、DL、SN、AF、LH 问题在于,作为输出,它只会产生: 交流自动对焦 其他值完全丢失。但是,当我将DCXR、RCXR、DCNX、RCNX添加到散列和eq时,我得到了正确的输出。但我不想那样!!我不想在字典中插入键时使用它们 我不明白为什么要排除输出中
DDATE、WEEK\u PERIOD、DPERIOD、RPERIOD、ALLIANCE、DTIME、RTIME
。我想排除属性DCXR、RCXR、DCNX、RCNX
算法的输出应为:
AC、DL、SN、AF、LH
问题在于,作为输出,它只会产生:
交流自动对焦
其他值完全丢失。但是,当我将DCXR、RCXR、DCNX、RCNX
添加到散列和eq时,我得到了正确的输出。但我不想那样!!我不想在字典中插入键时使用它们
我不明白为什么要排除输出中的其他值。据我所知,当我使用对象作为字典中的键时,我不必使用所有属性
下面的源代码正好产生了错误
源代码
这些对象不会消失,只是永远不会作为键插入到
dict
。您说您不想在散列计算中包含DCXR、RCXR、DCNX、RCNX
。那很好。但是您应该将它们包括在\uuuuu eq\uuu
检查中。否则,仅在这些属性上不同的对象被视为相等。这正是您的示例的情况:
- 第一个和第三个仅在这些属性上有所不同
- 第二、第四和第五也只是在这些属性上有所不同
dict[key]
来说,旧值只是被覆盖,因为键比较相等
旁注:你不应该使用
dict
作为变量名,因为它隐藏了内置类型dict我没有,但可能是因为他们发现你的问题不清楚。我还在努力理解你的意思。你能把你的问题说清楚吗?@Thierrylahuille我在字典里插入了5个键。最后我只有两把钥匙。我不明白为什么。输出应该是AC,DL,SN,AF,LH,但我只得到AC AF。我真的不明白为什么??我还用这些数据重现了这个错误,非常感谢。我可以给你看这个链接请在下面的链接,他们不使用相同的长度。我跟着他们做了什么。这就是困惑me@HaniGotc您已经正确地实现了两种方法\uuuuuuhash\uuuuuuu
和\uuuuuueq\uuuuu
,但是这两种方法都不包括属性DCXR、RCXR、DCNX、RCNX
。因此键(“01/15/17”,“2”,“1”,“2”,“0”,“13:50”,“18:25”,“AF”,“AF”,“CDG”,“YUL”)
和键(“01/15/17”,“2”,“1”,“2”,“0”,“13:50”,“18:25”,“DL”,“DL”,“CDG”,“YUL”)
比较相等,并且被认为是非常相同的键(这导致相关值的更新)。字典基本上是一个以链表为目标对象的哈希映射。它使用\uuuu eq\uuuu
检查来确定某个键是否已经是相应列表的一部分。谢谢@a_guest。我认为节目出了问题。你真的帮了大忙。我理解
#!/usr/bin/env python
import os
import sys
import argparse
from collections import defaultdict
from functools import partial
class Key(object):
def __init__(self, DDATE, WEEK_PERIOD, DPERIOD, RPERIOD, ALLIANCE, DTIME, RTIME, DCXR, RCXR, DCNX, RCNX):
self.DDATE = DDATE
self.WEEK_PERIOD = WEEK_PERIOD
self.DPERIOD = DPERIOD
self.RPERIOD = RPERIOD
self.ALLIANCE = ALLIANCE
self.DTIME = DTIME
self.RTIME = RTIME
self.DCXR = DCXR
self.RCXR = RCXR
self.DCNX = DCNX
self.RCNX = RCNX
def __hash__(self):
return hash((self.DDATE, self.WEEK_PERIOD, self.DPERIOD, self.RPERIOD, self.ALLIANCE,
self.DTIME, self.RTIME))
def __eq__(self, other):
return (self.DDATE, self.WEEK_PERIOD, self.DPERIOD, self.RPERIOD, self.ALLIANCE,
self.DTIME, self.RTIME) == (other.DDATE, other.WEEK_PERIOD, other.DPERIOD, other.RPERIOD, other.ALLIANCE, other.DTIME, other.RTIME)
def __ne__(self, other):
return not(self == other)
if __name__ == "__main__":
dict = defaultdict(partial(defaultdict, list))
key = Key("01/15/17","2","1","2","0","13:50","18:25","AF","AF","CDG","YUL")
dict[key][28].append(10.0)
key = Key("01/15/17","2","1","2","0","13:05","20:10","AC","AC","CDG","YUL")
dict[key][28].append(20.0)
key = Key("01/15/17","2","1","2","0","13:50","18:25","DL","DL","CDG","YUL")
dict[key][28].append(30.0)
key = Key("01/15/17","2","1","2","0","13:05","20:10","SN","SN","CDG","YUL")
dict[key][28].append(40.0)
key = Key("01/15/17","2","1","2","0","13:05","20:10","LH","LH","CDG","YUL")
dict[key][28].append(50.0)
for key in dict.keys():
print key.DCXR