【问题标题】:Hash Map in PythonPython中的哈希映射
【发布时间】:2012-01-31 23:23:57
【问题描述】:

我想在 Python 中实现一个 HashMap。我想请用户输入。根据他的输入,我正在从 HashMap 中检索一些信息。如果用户输入了HashMap的一个key,我想取回对应的value。

如何在 Python 中实现此功能?

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 hashmap


    【解决方案1】:

    Python 中的dictionary 是实现这一点的最佳方式。我们可以使用给定的&lt;key,value&gt; 对创建以下字典:

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

    要提取特定键的值,我们可以直接使用d[key]:

    name = d["1"] # The value of name would be "Sachin Tendulkar" here
    

    【讨论】:

      【解决方案2】:

      Python dictionary 是支持键值对的内置类型。

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

      以及使用 dict 关键字:

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

      或:

      streetno = {}
      streetno["1"] = "Sachin Tendulkar" 
      

      【讨论】:

      • 第二个示例只是以与之前相同的方式构建一个字典,然后将其复制。另一个使用dict,在这种情况下更合适,是dict(key1=value1, key2=value2, ...),但这需要字符串的键,这也是有效的Python标识符(在内部,这也会创建一个字典)。
      • 啊有趣,我没有意识到裸字符串是有效的标识符。
      • 是的,它看起来像一个“地图”,它的行为就像一个“地图”。但问题不是“Python 中的映射”而是“Python 中的哈希映射”:字典是哈希(!)映射吗?
      • @user2661619 是的。 dict 的底层实现使用哈希函数来生成项目的地址位置。实现在这里:hg.python.org/cpython/file/10eea15880db/Objects/dictobject.c
      • 你为什么不告诉我字典是hashmap
      【解决方案3】:

      在 python 中你会使用字典。

      它是python中非常重要的类型,经常使用。

      您可以通过以下方式轻松创建一个

      name = {}
      

      字典有很多方法:

      # add entries:
      >>> name['first'] = 'John'
      >>> name['second'] = 'Doe'
      >>> name
      {'first': 'John', 'second': 'Doe'}
      
      # you can store all objects and datatypes as value in a dictionary
      # as key you can use all objects and datatypes that are hashable
      >>> name['list'] = ['list', 'inside', 'dict']
      >>> name[1] = 1
      >>> name
      {'first': 'John', 'second': 'Doe', 1: 1, 'list': ['list', 'inside', 'dict']}
      

      你不能影响字典的顺序。

      【讨论】:

        【解决方案4】:

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

        from collections import Counter
        
        counter = Counter(["Sachin Tendulkar", "Sachin Tendulkar", "other things"])
        
        print(counter)
        

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

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

        【讨论】:

        • 我不明白这个问题的答案。你在这里得到的是一个字典,其中名称是键,值是一些计数器(你从哪里得到输入列表?)。虽然问题是寻找一个哈希映射,其中唯一键指向名称作为值。
        【解决方案5】:
        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()
        

        【讨论】:

          【解决方案6】:

          这里是使用python实现的Hash Map 为简单起见,哈希图的大小固定为 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
          

          【讨论】:

          • 我认为你的逻辑部分正确! hash(key) &amp; 1573%15= 13,但它是等价的:1001001 &amp; 0001111 = 00011119 而不是 13,我认为使用 mod 是正确的操作。如果我错了,请纠正我!
          • 你如何遍历列表?
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            哈希映射是 Python 内置的,它们被称为dictionaries

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

            用法:

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

            有关更多信息,请参阅文档,例如内置方法等等。它们很棒,并且在 Python 程序中很常见(不足为奇)。

            【讨论】:

              【解决方案9】:

              它是 Python 内置的。见dictionaries

              根据您的示例:

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

              然后你可以像这样访问它:

              sachine = streetno["1"]
              

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

              【讨论】:

                【解决方案10】:
                streetno = { 1 : "Sachin Tendulkar",
                            2 : "Dravid",
                            3 : "Sehwag",
                            4 : "Laxman",
                            5 : "Kohli" }
                

                并检索值:

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

                或者

                name = streetno[3]
                

                那是使用数字作为键,在数字周围加上引号以使用字符串作为键。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-07-22
                  • 1970-01-01
                  • 2016-08-04
                  • 1970-01-01
                  • 2011-08-11
                  • 2018-10-13
                  • 1970-01-01
                  相关资源
                  最近更新 更多