关于hashmap:Python中的哈希图

Hash Map in Python

我想在Python中实现HashMap。 我想请用户输入。 根据他的输入,我正在从HashMap中检索一些信息。 如果用户输入HashMap的键,我想检索相应的值。

如何在Python中实现此功能?

1
2
3
4
5
6
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")


Python字典是一种内置的类型,它支持键值对。

1
streetno = {"1":"Sachine Tendulkar","2":"Dravid","3":"Sehwag","4":"Laxman","5":"Kohli"}

以及使用dict关键字:

1
streetno = dict({"1":"Sachine Tendulkar","2":"Dravid"})

要么:

1
2
streetno = {}
streetno["1"] ="Sachine Tendulkar"


您想要的(在最初提出问题时)只是一个提示。提示:在Python中,您可以使用字典。


它是Python内置的。参见字典。

根据您的示例:

1
2
3
4
5
streetno = {"1":"Sachine Tendulkar",
           "2":"Dravid",
           "3":"Sehwag",
           "4":"Laxman",
           "5":"Kohli" }

然后,您可以像这样访问它:

1
sachine = streetno["1"]

还值得一提:它可以使用任何非可变数据类型作为键。也就是说,它可以使用元组,布尔值或字符串作为键。


1
2
3
4
5
streetno = { 1 :"Sachin Tendulkar",
            2 :"Dravid",
            3 :"Sehwag",
            4 :"Laxman",
            5 :"Kohli" }

并获取值:

1
name = streetno.get(3,"default value")

要么

1
name = streetno[3]

那就是使用数字作为键,在数字两边加上引号以使用字符串作为键。


哈希图是Python内置的,它们称为字典:

1
2
streetno = {}                        #create a dictionary called streetno
streetno["1"] ="Sachin Tendulkar"   #assign value to key"1"

用法:

1
2
"1" in streetno                      #check if key"1" is in streetno
streetno["1"]                        #get the value from key"1"

请参阅文档以获取更多信息,例如内置方法等。它们很棒,并且在Python程序中非常常见(毫不奇怪)。


这是使用python的Hash Map的实现
为了简单起见,哈希映射的大小固定为16。
这可以轻松更改。
重新哈希不在此代码范围内。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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"))

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sachin
sehwag
ganguly
srinath
kumble
dhoni
kohli
pandya
rohit
dhawan
shastri
manjarekar
gupta
agarkar
nehra
gawaskar
vengsarkar


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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()

在这种情况下,Python Counter也是一个不错的选择:

1
2
3
4
5
from collections import Counter

counter = Counter(["Sachin Tendulkar","Sachin Tendulkar","other things"])

print(counter)

这将返回一个字典,其中包含列表中每个元素的计数:

1
Counter({'Sachin Tendulkar': 2, 'other things': 1})