Python中的哈希映射
我想用Python实现一个HashMap。我想向用户请求输入。根据他的输入,我正在从HashMap中检索一些信息。如果用户输入HashMap的键,我想检索相应的值 如何在Python中实现此功能Python中的哈希映射,python,hashmap,Python,Hashmap,我想用Python实现一个HashMap。我想向用户请求输入。根据他的输入,我正在从HashMap中检索一些信息。如果用户输入HashMap的键,我想检索相应的值 如何在Python中实现此功能 HashMap<String,String> streetno=new HashMap<String,String>(); streetno.put("1", "Sachin Tendulkar"); streetno.put("2", "Dravid"); s
HashMap<String,String> streetno=new HashMap<String,String>();
streetno.put("1", "Sachin Tendulkar");
streetno.put("2", "Dravid");
streetno.put("3","Sehwag");
streetno.put("4","Laxman");
streetno.put("5","Kohli")
HashMap streetno=newhashmap();
put街(“1”、“Sachin Tendulkar”);
街道编号put(“2”,“Dravid”);
街号put(“3”、“Sehwag”);
街道编号put(“4”,“Laxman”);
街号put(“5”、“科利”)
是支持键值对的内置类型
streetno = {"1": "Sachin Tendulkar", "2": "Dravid", "3": "Sehwag", "4": "Laxman", "5": "Kohli"}
以及使用dict关键字:
streetno = dict({"1": "Sachin Tendulkar", "2": "Dravid"})
或:
哈希映射是Python中内置的,它们被称为: 用法:
"1" in streetno #check if key "1" is in streetno
streetno["1"] #get the value from key "1"
有关更多信息,如内置方法等,请参阅文档。它们很棒,在Python程序中非常常见(毫不奇怪)。您想要的(最初提出这个问题时)只是一个提示。这里有一个提示:在Python中,您可以使用。它是Python内置的。看 根据您的示例:
streetno = {"1": "Sachine Tendulkar",
"2": "Dravid",
"3": "Sehwag",
"4": "Laxman",
"5": "Kohli" }
然后您可以像这样访问它:
sachine = streetno["1"]
还值得一提的是:它可以使用任何不可变的数据类型作为键。也就是说,它可以使用元组、布尔值或字符串作为键
streetno = { 1 : "Sachin Tendulkar",
2 : "Dravid",
3 : "Sehwag",
4 : "Laxman",
5 : "Kohli" }
和检索值:
name = streetno.get(3, "default value")
或
这就是使用数字作为键,在数字周围加引号以使用字符串作为键。下面是使用python实现的哈希映射 为了简单起见,哈希映射的大小是固定的16。 这很容易改变。 重新灰化超出了此代码的范围
class Node:
def __init__(self, key, value):
self.key = key
self.value = value
self.next = None
class HashMap:
def __init__(self):
self.store = [None for _ in range(16)]
def get(self, key):
index = hash(key) & 15
if self.store[index] is None:
return None
n = self.store[index]
while True:
if n.key == key:
return n.value
else:
if n.next:
n = n.next
else:
return None
def put(self, key, value):
nd = Node(key, value)
index = hash(key) & 15
n = self.store[index]
if n is None:
self.store[index] = nd
else:
if n.key == key:
n.value = value
else:
while n.next:
if n.key == key:
n.value = value
return
else:
n = n.next
n.next = nd
hm = HashMap()
hm.put("1", "sachin")
hm.put("2", "sehwag")
hm.put("3", "ganguly")
hm.put("4", "srinath")
hm.put("5", "kumble")
hm.put("6", "dhoni")
hm.put("7", "kohli")
hm.put("8", "pandya")
hm.put("9", "rohit")
hm.put("10", "dhawan")
hm.put("11", "shastri")
hm.put("12", "manjarekar")
hm.put("13", "gupta")
hm.put("14", "agarkar")
hm.put("15", "nehra")
hm.put("16", "gawaskar")
hm.put("17", "vengsarkar")
print(hm.get("1"))
print(hm.get("2"))
print(hm.get("3"))
print(hm.get("4"))
print(hm.get("5"))
print(hm.get("6"))
print(hm.get("7"))
print(hm.get("8"))
print(hm.get("9"))
print(hm.get("10"))
print(hm.get("11"))
print(hm.get("12"))
print(hm.get("13"))
print(hm.get("14"))
print(hm.get("15"))
print(hm.get("16"))
print(hm.get("17"))
输出:
sachin
sehwag
ganguly
srinath
kumble
dhoni
kohli
pandya
rohit
dhawan
shastri
manjarekar
gupta
agarkar
nehra
gawaskar
vengsarkar
在这种情况下,Python也是一个不错的选择:
from collections import Counter
counter = Counter(["Sachin Tendulkar", "Sachin Tendulkar", "other things"])
print(counter)
这将返回一个dict,其中包含列表中每个元素的计数:
Counter({'Sachin Tendulkar': 2, 'other things': 1})
在python中,您将使用字典 它是python中非常重要的类型,经常使用 您可以通过以下方式轻松创建一个
name={}
字典有很多方法:
#添加条目:
>>>姓名['first']='John'
>>>名称['second']='Doe'
>>>名字
{'first':'John','second':'Doe'}
#您可以将所有对象和数据类型作为值存储在字典中
#作为密钥,您可以使用所有可散列的对象和数据类型
>>>名称['list']=['list','inside','dict']
>>>名称[1]=1
>>>名字
{'first':'John','second':'Doe',1:1,'list':['list','inside','dict']}
您不能影响指令的顺序。a在Python中是实现这一点的最佳方法。我们可以使用给定的
对创建以下词典:d={“1”:“Sachin Tendulkar”,“2”:“Dravid”,“3”:“Sehwag”,“4”:“Laxman”,“5”:“Kohli”}
要提取特定键的值,我们可以直接使用d[key]
:name=d[“1”]#name的值在这里是“Sachin Tendulkar”
第二个示例只是以与前面相同的方式构建dict,然后复制它。另一种用法是dict(key1=value1,key2=value2,…),在这种上下文中更合适,但是它需要字符串的键,这些字符串也是有效的Python标识符(在内部,这也创建了一个字典)。啊,有趣的是,我没有意识到裸字符串是有效的标识符。是的,它看起来像一张“地图”,它的行为也像一张“地图”。但问题不是“Python中的映射”,而是“Python中的哈希映射”:字典是哈希(!)映射吗?@user2661619是的。dict的底层实现使用哈希函数生成项的地址位置。实现就在这里:你为什么不告诉我字典是hashmapI呢?我认为你的逻辑部分是正确的hash(key)&15
,73%15=13
,但它是等价的:1001001&0001111=0001111
,即9
而不是13
,我认为使用mod是正确的操作。如果我错了,请纠正我!你是如何反复浏览这个列表的?我不明白这是怎么回答这个问题的。你在这里得到的是一个字典,其中名称是键,值是一些计数器(你从哪里得到输入列表?)。而问题是寻找一个散列映射,其中唯一的键指向作为值的名称。
sachin
sehwag
ganguly
srinath
kumble
dhoni
kohli
pandya
rohit
dhawan
shastri
manjarekar
gupta
agarkar
nehra
gawaskar
vengsarkar
class HashMap:
def __init__(self):
self.size = 64
self.map = [None] * self.size
def _get_hash(self, key):
hash = 0
for char in str(key):
hash += ord(char)
return hash % self.size
def add(self, key, value):
key_hash = self._get_hash(key)
key_value = [key, value]
if self.map[key_hash] is None:
self.map[key_hash] = list([key_value])
return True
else:
for pair in self.map[key_hash]:
if pair[0] == key:
pair[1] = value
return True
else:
self.map[key_hash].append(list([key_value]))
return True
def get(self, key):
key_hash = self._get_hash(key)
if self.map[key_hash] is not None:
for pair in self.map[key_hash]:
if pair[0] == key:
return pair[1]
return None
def delete(self, key):
key_hash = self._get_hash(key)
if self.map[key_hash] is None :
return False
for i in range(0, len(self.map[key_hash])):
if self.map[key_hash][i][0] == key:
self.map[key_hash].pop(i)
return True
def print(self):
print('---Phonebook---')
for item in self.map:
if item is not None:
print(str(item))
h = HashMap()
from collections import Counter
counter = Counter(["Sachin Tendulkar", "Sachin Tendulkar", "other things"])
print(counter)
Counter({'Sachin Tendulkar': 2, 'other things': 1})