在python中将对象用作键时索引哈希表
所以我有两个类“key”和“value”,其思想是用它们创建一个哈希表在python中将对象用作键时索引哈希表,python,hash,hashtable,Python,Hash,Hashtable,所以我有两个类“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):
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
我怀疑您遇到的问题是在
键
实例中使用字符串构建字典。然后,当您去查找一个项目时,您使用的是键
实例中的整数<代码>“0”在Python中不等于0
,因此查找失败
不要使用qkey=key(1,1,16,0,0,0)
,而是尝试在测试代码中使用qkey=key(“1”、“1”、“16”、“0”、“0”)
或者,当您首先创建键
s和值
s时,您可能希望将字符串转换为整数和浮点值:
newkey = key(*map(int, part_list[:6])) # first six values are ints
newvalue = value(*map(float, part_list[6:11])) # next five are floats
您可以通过使用元组作为字典键而不是自定义类来简化这一过程。例如,由于您创建了密钥,因此:
key(1,1,16,0,0,0)
您也可以在这里使用一个简单的元组
(1,1,16,0,0,0)
当读取数据时:
tuple(part_list[:6])
元组是字典的好键,这样就不必担心类了。这些值也可以逻辑上存储为元组。或者您有理由需要更复杂的结构吗?它使用您的虚拟值(5、3、16、0、0、0)对我有效。您确定“report.txt”中确实有一个包含这些值的键吗?你能提供一个包含示例数据的例子来说明这个问题吗?是的,我确信这个值是存在的,一个非常简单的文件就是这样的:(我将把它添加到问题中)首先,你不需要在课程开始时使用有趣的变量。这些不是“默认值”,而是类变量。更改一个将更改所有实例的一个。如果您想要默认值,请使用def uu init uu(self,a=-1,b=-1)等等。无论如何,您可以使用collections.namedtuple来返回一个简单的hashable类型,而不是这些类。“-1”只是用于调试,它们实际上并不重要。我对如何使其与对象一起工作感兴趣?这并不是对所提出问题的真正答案。你不应该发表评论作为回答。我知道你还没有足够的代表发表评论,但这不是借口。我试图回答问题的“我怎样才能让这更容易”部分。