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")
Kiran Bhat
la source

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" 
Alan
la source
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 .

Christian Neverdal
la source
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é.

Edwin
la source
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.

totaam
la source
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).

se détendre
la source
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
Vishwas Abhyankar
la source
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()
krezaeim
la source
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})
Shadowtrooper
la source
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.

Franc
la source