Mappa hash in Python


144

Voglio implementare una HashMap in Python. Voglio chiedere a un utente un input. a seconda del suo contributo, sto recuperando alcune informazioni dalla HashMap. Se l'utente inserisce una chiave di HashMap, vorrei recuperare il valore corrispondente.

Come posso implementare questa funzionalità in 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")

Risposte:


246

Il dizionario Python è un tipo incorporato che supporta coppie chiave-valore.

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

oltre a utilizzare la parola chiave dict:

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

o:

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

11
Il secondo esempio costruisce un dict esattamente come prima e poi lo copia. L'altro uso dict, che sarebbe più appropriato in questo contesto, è dict(key1=value1, key2=value2, ...)che richiede le chiavi delle stringhe che sono anche identificatori Python validi (e internamente, crea anche un dizionario).

Ah interessante, non mi rendevo conto che le stringhe nude erano identificatori validi.
Alan,

Non sono sicuro di averti capito correttamente (che cosa sono le "stringhe nude"?), Ma credo che tu l'abbia capovolto. Il tuo secondo esempio aggiornato non è valido e non ho mai avuto intenzione di dichiarare qualcosa del genere. La sintassi degli argomenti delle parole chiave , che accetta solo identificatori nudi, utilizza internamente un dizionario. Il dictcostruttore supporta argomenti di parole chiave e funziona come def dict(**kwds): return kwdsse gli argomenti di parole chiave forniti.

il secondo esempio genera un errore di sintassi. i nomi delle variabili non possono iniziare con un numero
Simon Bergot

Sì, sembra una "mappa" e si comporta come una "mappa". Ma la domanda non è "Map in Python" ma "Hash Map in Python": i dizionari sono una mappa hash (!)?
309963d8521805330a44bdcb3d87f3,

27

Tutto quello che volevi (al momento della domanda iniziale) era un suggerimento. Ecco un suggerimento: in Python puoi usare i dizionari .


24

È integrato per Python. Vedi dizionari .

Sulla base del tuo esempio:

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

È quindi possibile accedervi in ​​questo modo:

sachine = streetno["1"]

Vale anche la pena menzionare: può utilizzare qualsiasi tipo di dati non modificabile come chiave. Cioè, può usare una tupla, un valore booleano o una stringa come chiave.


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

E per recuperare i valori:

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

O

name = streetno[3]

Sta usando il numero come chiavi, metti le virgolette intorno ai numeri per usare le stringhe come chiavi.


14

Le mappe hash sono integrate in Python, sono chiamate dizionari :

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

Uso:

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

Consultare la documentazione per ulteriori informazioni, ad esempio metodi integrati e così via. Sono fantastici e molto comuni nei programmi Python (non sorprende).


12

Ecco l'implementazione della Hash Map usando Python Per la semplicità, la mappa hash ha una dimensione fissa 16. Questo può essere cambiato facilmente. Il rehashing non rientra nell'ambito di questo codice.

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

Produzione:

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

Penso che la tua logica sia parzialmente corretta! hash(key) & 15, 73%15= 13ma è equivalente: 1001001 & 0001111 = 0001111vale a dire 9e no 13, penso che usare mod sia l'operazione corretta. Correggimi se sbaglio!
Anu,

Come si fa a scorrere l'elenco?
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

Python Counter è anche una buona opzione in questo caso:

from collections import Counter

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

print(counter)

Ciò restituisce un dict con il conteggio di ciascun elemento nell'elenco:

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

1

In Python useresti un dizionario.

È un tipo molto importante in Python e spesso usato.

Puoi crearne uno facilmente tramite

name = {}

I dizionari hanno molti metodi:

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

Non puoi influenzare l'ordine di un dict.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.