Hash Map en Python


144

Je souhaite implémenter un HashMap en Python. Je veux demander une entrée à un utilisateur. en fonction de son entrée, je récupère certaines informations du HashMap. Si l'utilisateur entre une clé du HashMap, je voudrais récupérer la valeur correspondante.

Comment implémenter cette fonctionnalité en 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")

Réponses:


246

Le dictionnaire Python est un type intégré qui prend en charge les paires clé-valeur.

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

ainsi que l'utilisation du mot-clé dict:

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

ou:

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

11
Le deuxième exemple construit simplement un dict de la même manière qu'avant, puis le copie. L'autre utilisation dict, qui serait plus appropriée dans ce contexte, est dict(key1=value1, key2=value2, ...)mais cela nécessite les clés des chaînes qui sont également des identifiants Python valides (et en interne, cela crée également un dictionnaire).

Ah intéressant, je ne savais pas que les chaînes nues étaient des identifiants valides.
Alan

Je ne sais pas si je vous comprends bien (que sont les "cordes nues"?), Mais je crois que vous l'avez compris à l'envers. Votre deuxième exemple mis à jour n'est pas valide et je n'ai jamais eu l'intention de déclarer quelque chose comme ça. La syntaxe des arguments de mot-clé , qui n'accepte que les identificateurs nus, utilise en interne un dictionnaire. Le dictconstructeur prend en charge les arguments de mots-clés et fonctionne comme def dict(**kwds): return kwdssi des arguments de mots-clés étaient donnés.

Le deuxième exemple soulève une erreur de syntaxe. les noms de variables ne peuvent pas commencer par un nombre
Simon Bergot

Ouais, ça ressemble à une "carte" et ça agit comme une "carte". Mais la question n'est pas "Map in Python" mais "Hash Map in Python": les dictionnaires sont-ils une map hash (!)?
309963d8521805330a44bdcb3d87f3

27

Tout ce que vous vouliez (au moment où la question a été posée à l'origine) était un indice. Voici un indice: en Python, vous pouvez utiliser des dictionnaires .


24

Il est intégré à Python. Voir les dictionnaires .

Sur la base de votre exemple:

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

Vous pourrez alors y accéder comme ceci:

sachine = streetno["1"]

Il convient également de mentionner: il peut utiliser n'importe quel type de données non mutable comme clé. Autrement dit, il peut utiliser un tuple, un booléen ou une chaîne comme clé.


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

Et pour récupérer des valeurs:

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

Ou

name = streetno[3]

Cela utilise des nombres comme clés, mettez des guillemets autour des nombres pour utiliser des chaînes comme clés.


14

Les cartes de hachage sont intégrées à Python, elles sont appelées dictionnaires :

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

Usage:

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

Voir la documentation pour plus d'informations, par exemple les méthodes intégrées, etc. Ils sont excellents et très courants dans les programmes Python (sans surprise).


12

Voici l'implémentation de la carte de hachage en utilisant python Pour la simplicité, la carte de hachage est d'une taille fixe 16. Cela peut être changé facilement. Rehashing est hors de portée de ce code.

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"))

Production:

sachin
sehwag
ganguly
srinath
kumble
dhoni
kohli
pandya
rohit
dhawan
shastri
manjarekar
gupta
agarkar
nehra
gawaskar
vengsarkar

Je pense que votre logique est partiellement correcte! hash(key) & 15, 73%15= 13mais c'est équivalent: 1001001 & 0001111 = 0001111c'est à dire 9et non 13, je pense que l'utilisation de mod est l'opération correcte. Corrigez-moi si je me trompe!
Anu

Mais comment parcourez-vous la liste?
Petro

8
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()

7

Le compteur Python est également une bonne option dans ce cas:

from collections import Counter

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

print(counter)

Cela renvoie un dict avec le nombre de chaque élément de la liste:

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

1

En python, vous utiliseriez un dictionnaire.

C'est un type très important en python et souvent utilisé.

Vous pouvez en créer un facilement en

name = {}

Les dictionnaires ont de nombreuses méthodes:

# 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']}

Vous ne pouvez pas influencer l'ordre d'un dict.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.