Peta Hash dengan Python

144

Saya ingin mengimplementasikan HashMap dengan Python. Saya ingin meminta input dari pengguna. tergantung pada masukannya saya mengambil beberapa informasi dari HashMap. Jika pengguna memasukkan kunci HashMap, saya ingin mengambil nilai yang sesuai.

Bagaimana cara menerapkan fungsi ini dalam 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
sumber

Jawaban:

246

Kamus Python adalah tipe bawaan yang mendukung pasangan nilai kunci.

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

serta menggunakan kata kunci dict:

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

atau:

streetno = {}
streetno["1"] = "Sachin Tendulkar" 
Alan
sumber
11
Contoh kedua hanya membuat dict dengan cara yang sama seperti sebelumnya dan kemudian menyalinnya. Penggunaan lain dict, yang akan lebih sesuai dalam konteks ini, adalah dict(key1=value1, key2=value2, ...)tetapi yang memerlukan kunci untuk string yang juga pengidentifikasi Python yang valid (dan secara internal, ini juga membuat kamus).
Ah menarik, saya tidak menyadari bahwa string telanjang adalah pengidentifikasi yang valid.
Alan
Saya tidak yakin apakah saya mengerti Anda dengan benar (apa itu "string telanjang"?), Tapi saya yakin Anda mendapatkannya mundur. Contoh kedua Anda yang diperbarui tidak valid dan saya tidak pernah bermaksud menyatakan sesuatu seperti itu berfungsi. The argumen kata kunci sintaks, yang menerima hanya pengidentifikasi telanjang, internal menggunakan kamus. The dictkonstruktor mendukung kata kunci argumen dan bekerja seperti def dict(**kwds): return kwdsjika diberi argumen kata kunci.
Contoh kedua memunculkan kesalahan sintaksis. nama variabel tidak dapat dimulai dengan angka
Simon Bergot
Ya, ini terlihat seperti "peta" dan bertindak seperti "peta". Tetapi pertanyaannya bukan "Peta dengan Python" tetapi "Peta Hash dengan Python": Apakah kamus peta hash (!)?
309963d8521805330a44bdcb3d87f3
27

Yang Anda inginkan (pada saat pertanyaan itu awalnya diajukan) adalah petunjuk. Ini sebuah petunjuk: Di Python, Anda bisa menggunakan kamus .

Christian Neverdal
sumber
24

Ini built-in untuk Python. Lihat kamus .

Berdasarkan contoh Anda:

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

Anda kemudian dapat mengaksesnya seperti ini:

sachine = streetno["1"]

Juga layak disebutkan: itu dapat menggunakan tipe data yang tidak bisa diubah sebagai kunci. Artinya, dapat menggunakan tuple, boolean, atau string sebagai kunci.

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

Dan untuk mengambil nilai:

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

Atau

name = streetno[3]

Itu menggunakan angka sebagai kunci, beri tanda kutip di sekitar angka untuk menggunakan string sebagai kunci.

totaam
sumber
14

Peta hash dibangun di dalam Python, mereka disebut kamus :

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

Pemakaian:

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

Lihat dokumentasi untuk informasi lebih lanjut, misalnya metode bawaan dan sebagainya. Mereka hebat, dan sangat umum dalam program Python (tidak mengejutkan).

beristirahat
sumber
12

Berikut ini adalah implementasi dari Hash Map menggunakan python Untuk kesederhanaan peta hash adalah ukuran tetap 16. Ini dapat diubah dengan mudah. Rehashing berada di luar jangkauan kode ini.

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

Keluaran:

sachin
sehwag
ganguly
srinath
kumble
dhoni
kohli
pandya
rohit
dhawan
shastri
manjarekar
gupta
agarkar
nehra
gawaskar
vengsarkar
Wisnu Abhyankar
sumber
Saya pikir logika Anda sebagian benar! hash(key) & 15,, 73%15= 13tapi itu sama: 1001001 & 0001111 = 0001111yaitu 9dan tidak 13, saya pikir menggunakan mod adalah operasi yang benar. Koreksi saya jika saya salah!
Anu
Bagaimana Anda mengulangi daftar itu?
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
sumber
7

Penghitung Python juga merupakan opsi yang baik dalam hal ini:

from collections import Counter

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

print(counter)

Ini mengembalikan dict dengan jumlah setiap elemen dalam daftar:

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

Dalam python Anda akan menggunakan kamus.

Ini adalah tipe yang sangat penting dalam python dan sering digunakan.

Anda dapat membuatnya dengan mudah

name = {}

Kamus memiliki banyak metode:

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

Anda tidak dapat memengaruhi urutan dikte.

jujur
sumber