【问题标题】:index a hashtable when using object as key in python在python中使用对象作为键时索引哈希表
【发布时间】:2014-09-01 04:57:18
【问题描述】:

所以我有“key”和“value”这两个类,想法是用它们创建一个哈希表。

class key:
        num_master = -1
        num_slave = -1
        width = -1
        num_pipeline = -1
        diff_clock_master = -1
        diff_clock_slave = -1

        def __init__(self,m,s,w,p,dm,ds):
                self.num_master = m
                self.num_slave = s
                self.width = w
                self.num_pipeline = p
                self.diff_clock_master = dm
                self.diff_clock_slave = ds

        def __hash__(self):
                return hash((self.num_master,self.num_slave,self.width,self.num_pipeline,self.diff_clock_master,self.diff_clock_slave))

        def __eq__(self,other):
                return (self.num_master,self.num_slave,self.width,self.num_pipeline,self.diff_clock_master,self.diff_clock_slave) == (other.num_master,other.num_slave,other.width,other.num_pipeline,other.diff_clock_master,other.diff_clock_slave)   

class value:
        alms = -1
        brams = -1
        labs = -1
        freq = -1
        power = -1

        def __init__(self,a,b,l,f,p):
                self.alms = a
                self.brams = b
                self.labs = l
                self.freq = f
                self.power = p

所以我按如下方式填充哈希表:

def parsify(report_name):
    report = open(report_name,'r')
    for line in report:

                #split line
                part_list = line.split()

                newkey = key(part_list[0],part_list[1],part_list[2],part_list[3],part_list[4],part_list[5])
                newvalue = value(part_list[6],part_list[7],part_list[8],part_list[9],part_list[10])
                hash_table[newkey]=newvalue

                return hash_table

然后我尝试像这样索引哈希表:

#test
hash_table = parsify('report.txt')

qkey = key(1,1,16,0,0,0)
print hash_table[qkey].alms

但它不起作用。我怎样才能索引到这个哈希表,我怎样才能让这更容易?

这是一个示例 report.txt:

1   1   16  0   0   0   102.0   0.0 10.2    300.75  1.36    m1_s1_w16_p0_dcm0_dcs0_traffic_0_----->_m1_s1_w16_p0_dcm0_dcs0_traffic_0
1   1   16  1   0   0   102.0   0.0 10.2    300.75  1.36    m1_s1_w16_p1_dcm0_dcs0_traffic_0_----->_m1_s1_w16_p1_dcm0_dcs0_traffic_0
1   1   16  2   0   0   102.0   0.0 10.2    300.75  1.36    m1_s1_w16_p2_dcm0_dcs0_traffic_0_----->_m1_s1_w16_p2_dcm0_dcs0_traffic_0
1   1   16  3   0   0   166.0   0.0 16.6    303.03  2.02    m1_s1_w16_p3_dcm0_dcs0_traffic_0_----->_m1_s1_w16_p3_dcm0_dcs0_traffic_0

【问题讨论】:

  • 它适用于我使用你的虚拟值(5、3、16、0、0、0)。您确定“report.txt”中实际上有一个带有这些值的键吗?您能否提供一个独立的示例,其中包含说明问题的示例数据?
  • 是的,我确定这个值存在,一个非常简单的文件看起来像这样:(我将它添加到问题中)
  • 首先,您不需要在课程开始时需要有趣的变量。这些不是“默认值”,而是类变量。更改一个将为 all 实例更改它。如果您想要默认值,请使用 def __init__(self, a=-1, b=-1) 等等。
  • 不管怎样,你可以使用 collections.namedtuple 来代替这些类来返回一个简单的哈希类型。
  • '-1's 仅用于调试,它们并不重要。我对如何使它与对象一起工作感兴趣?

标签: python hash hashtable


【解决方案1】:

您可以通过为字典键使用元组而不是自定义类来简化此操作。例如,既然您这样创建密钥:

key(1,1,16,0,0,0)

你也可以在这里使用一个简单的元组

(1,1,16,0,0,0)

在读取数据时:

tuple(part_list[:6])

元组是字典的好键,因此您无需担心类。这些值也可以在逻辑上存储为元组。还是您有理由要求更复杂的结构?

【讨论】:

  • 这并不是对所提出问题的真正答案。您不应该发表评论作为答案。我知道您还没有足够的代表发表评论,但这不是借口。
  • 我试图回答问题的“我怎样才能让这更容易”部分。
【解决方案2】:

我怀疑您遇到的问题是您使用 key 实例中的字符串构建字典。然后当你去查找一个项目时,你在key 实例中使用整数。 "0" 在 Python 中不等于 0,因此您的查找失败。

尝试在测试代码中使用qkey = key("1","1","16","0","0","0"),而不是qkey = key(1,1,16,0,0,0)

或者,您可能希望在首先创建 keys 和 values 时将字符串转换为整数和浮点值:

newkey = key(*map(int, part_list[:6]))         # first six values are ints
newvalue = value(*map(float, part_list[6:11])) # next five are floats

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 2013-06-27
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2013-02-24
    • 1970-01-01
    相关资源
    最近更新 更多