【问题标题】:After being inserted as dict keys, some objects don't show up in the keys list作为字典键插入后,某些对象不会显示在键列表中
【发布时间】:2017-12-16 18:35:40
【问题描述】:

问题描述

我想使用一个对象作为字典中的键。我想用来比较键的字典属性是:DDATE, WEEK_PERIOD, DPERIOD, RPERIOD, ALLIANCE, DTIME, RTIME。我想排除属性DCXR, RCXR, DCNX, RCNX

算法的输出应该是:

AC、DL、SN、AF、LH

问题是它只作为输出产生:

交流自动对焦

其他值完全丢失。但是,当我将 DCXR, RCXR, DCNX, RCNX 添加到 hasheq 时,我得到了正确的输出。但我不想要那个!!当我在字典中插入键时,我不想使用它们。

我不明白为什么它会排除输出中的其他值。据我所知,当我将对象用作字典中的键时,我不必使用所有属性。

以下源代码会产生错误。


源代码

#!/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

【问题讨论】:

  • 我没有,但可能是因为他们发现您的问题不清楚。我还在努力理解你的意思。你能把你的问题说清楚一点吗?
  • @ThierryLathuille 我在字典中插入了 5 个键。我最终只有 2 把钥匙。我不明白为什么。输出应该是AC、DL、SN、AF、LH,但我只得到AC AF。我真的不明白为什么??我也用数据重现了错误

标签: python object dictionary hash


【解决方案1】:

那些对象不会消失,它们只是永远不会作为键插入dict。您说您不想在哈希计算中包含DCXR, RCXR, DCNX, RCNX。没关系。但是您应该将它们包含在__eq__ 检查中。否则,仅在这些属性上不同的对象被认为是相等的。这正是您的示例的情况:

  • 第 1 和第 3 仅在这些属性上有所不同。
  • 2nd、4th 和 5th 也只是在这些属性上有所不同。

所以发生的情况是第一个和第二个对象作为键插入,并且对于每个后续dict[key],旧值将被覆盖,因为键比较相等。


旁注:您不应该使用 dict 作为变量名,因为它会隐藏内置类型 dict

【讨论】:

  • A_guest 非常感谢。我可以给你看这个链接吗?请stackoverflow.com/questions/4901815/…在下面的链接中,他们不使用相等的长度。我跟着他们做了。这让我感到困惑
  • @HaniGotc 您已经正确实现了__hash____eq__ 这两种方法,但是两者都不包含DCXR, RCXR, DCNX, RCNX 属性。因此Key("01/15/17","2","1","2","0","13:50","18:25","AF","AF","CDG","YUL")Key("01/15/17","2","1","2","0","13:50","18:25","DL","DL","CDG","YUL") 比较相等并被认为是相同的键(这会导致相关值的更新)。字典基本上是一个以链表为目标对象的哈希映射。它使用__eq__ 检查来确定一个键是否已经是相应列表的一部分。
  • 谢谢@a_guest。我以为程序有问题。你真的有帮助。我明白了
猜你喜欢
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2022-07-28
  • 1970-01-01
相关资源
最近更新 更多