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