Hash Map in Python

144

Ich möchte eine HashMap in Python implementieren. Ich möchte einen Benutzer um eine Eingabe bitten. Abhängig von seiner Eingabe rufe ich einige Informationen aus der HashMap ab. Wenn der Benutzer einen Schlüssel der HashMap eingibt, möchte ich den entsprechenden Wert abrufen.

Wie implementiere ich diese Funktionalität 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")
Kiran Bhat
quelle

Antworten:

246

Das Python-Wörterbuch ist ein integrierter Typ, der Schlüssel-Wert-Paare unterstützt.

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

sowie mit dem Schlüsselwort dict:

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

oder:

streetno = {}
streetno["1"] = "Sachin Tendulkar" 
Alan
quelle
11
Das zweite Beispiel erstellt ein Diktat auf die gleiche Weise wie zuvor und kopiert es dann. Die andere Verwendung dict, die in diesem Zusammenhang angemessener wäre dict(key1=value1, key2=value2, ...), erfordert jedoch die Schlüssel für Zeichenfolgen, die auch gültige Python-Bezeichner sind (und intern wird dadurch auch ein Wörterbuch erstellt).
Ah interessant, ich wusste nicht, dass nackte Strings gültige Identifikatoren sind.
Alan
Ich bin mir nicht sicher, ob ich dich richtig verstehe (was sind "nackte Saiten"?), Aber ich glaube, du hast es rückwärts verstanden. Ihr aktualisiertes zweites Beispiel ist ungültig und ich wollte nie so etwas sagen. Die Syntax der Schlüsselwortargumente , die nur nackte Bezeichner akzeptiert , verwendet intern ein Wörterbuch. Der dictKonstruktor unterstützt Schlüsselwortargumente und funktioniert so, als def dict(**kwds): return kwdsob Schlüsselwortargumente angegeben würden.
Das zweite Beispiel löst einen Syntaxfehler aus. Variablennamen können nicht mit einer Zahl beginnen
Simon Bergot
Ja, es sieht aus wie eine "Karte" und es verhält sich wie eine "Karte". Die Frage ist aber nicht "Map in Python", sondern "Hash Map in Python": Sind Wörterbücher eine Hash (!) Map?
309963d8521805330a44bdcb3d87f3
27

Alles, was Sie wollten (zu der Zeit, als die Frage ursprünglich gestellt wurde), war ein Hinweis. Hier ist ein Hinweis: In Python können Sie Wörterbücher verwenden .

Christian Neverdal
quelle
24

Es ist für Python integriert. Siehe Wörterbücher .

Anhand Ihres Beispiels:

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

Sie können dann folgendermaßen darauf zugreifen:

sachine = streetno["1"]

Erwähnenswert ist auch, dass jeder nicht veränderbare Datentyp als Schlüssel verwendet werden kann. Das heißt, es kann ein Tupel, ein Boolescher Wert oder eine Zeichenfolge als Schlüssel verwendet werden.

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

Und um Werte abzurufen:

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

Oder

name = streetno[3]

Das heißt, Zahlen als Schlüssel verwenden, Anführungszeichen um die Zahlen setzen, um Zeichenfolgen als Schlüssel zu verwenden.

totaam
quelle
14

Hash-Maps sind in Python integriert und werden als Wörterbücher bezeichnet :

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

Verwendung:

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

Weitere Informationen finden Sie in der Dokumentation, z. B. integrierte Methoden usw. Sie sind großartig und in Python-Programmen sehr verbreitet (nicht überraschend).

entspannen
quelle
12

Hier ist die Implementierung der Hash-Map mit Python. Der Einfachheit halber hat die Hash-Map eine feste Größe 16. Dies kann leicht geändert werden. Das Aufwärmen fällt nicht in den Geltungsbereich dieses Codes.

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

Ausgabe:

sachin
sehwag
ganguly
srinath
kumble
dhoni
kohli
pandya
rohit
dhawan
shastri
manjarekar
gupta
agarkar
nehra
gawaskar
vengsarkar
Vishwas Abhyankar
quelle
Ich denke deine Logik ist teilweise richtig! hash(key) & 15,, 73%15= 13aber es ist äquivalent: 1001001 & 0001111 = 0001111dh 9und nicht 13, ich denke, die Verwendung von Mod ist die richtige Operation. Korrigiere mich, wenn ich falsch liege!
Anu
Wie iterieren Sie die 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
quelle
7

Python Counter ist auch in diesem Fall eine gute Option:

from collections import Counter

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

print(counter)

Dies gibt ein Diktat mit der Anzahl der einzelnen Elemente in der Liste zurück:

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

In Python würden Sie ein Wörterbuch verwenden.

Es ist ein sehr wichtiger Typ in Python und wird oft verwendet.

Sie können einfach eine erstellen

name = {}

Wörterbücher haben viele Methoden:

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

Sie können die Reihenfolge eines Diktats nicht beeinflussen.

Frank
quelle