Python Hash Haritası


144

Python'da bir HashMap uygulamak istiyorum. Bir kullanıcıdan bir girdi istemek istiyorum. girdisine bağlı olarak HashMap'ten bazı bilgiler alıyorum. Kullanıcı HashMap'in bir anahtarını girerse, karşılık gelen değeri almak istiyorum.

Bu işlevselliği Python'da nasıl uygularım?

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

Yanıtlar:


246

Python sözlüğü , anahtar / değer çiftlerini destekleyen yerleşik bir türdür.

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

dict anahtar sözcüğünü kullanmanın yanı sıra:

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

veya:

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

11
İkinci örnek, daha önce olduğu gibi bir dikte oluşturur ve kopyalar. dictBu bağlamda daha uygun olacak bir diğer kullanım , dict(key1=value1, key2=value2, ...)aynı zamanda geçerli Python tanımlayıcıları olan dizelerin anahtarlarını gerektirmesidir (ve dahili olarak, bu da bir sözlük oluşturur).

İlginç, çıplak dizelerin geçerli tanımlayıcılar olduğunun farkında değildim.
Alan

Seni doğru anladığımdan emin değilim ("çıplak teller" nedir?), Ama geri aldığını düşünüyorum. Güncellenmiş ikinci örneğiniz geçersiz ve bu tür bir şeyi asla belirtmek istemedim. Yalnızca açık tanımlayıcıları kabul eden anahtar kelime sözdizimi dahili olarak bir sözlük kullanır. Yapıcı desteklenirken anahtar kelime argümanları ve benzeri eserler anahtar kelime argümanlar verilirse. dictdef dict(**kwds): return kwds

ikinci örnek bir sözdizimi hatası verir. değişken adları bir sayı ile başlayamaz
Simon Bergot

Evet, "harita" gibi görünüyor ve "harita" gibi davranıyor. Ama soru "Python'da Harita" değil, "Python'da Karma Harita" değil: Sözlükler karma (!) Harita mı?
309963d8521805330a44bdcb3d87f3


24

Python için yerleşiktir. Sözlüklere bakın .

Örneğinize göre:

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

Daha sonra şu şekilde erişebilirsiniz:

sachine = streetno["1"]

Ayrıca belirtmek gerekir: Değişken olmayan herhangi bir veri türünü bir anahtar olarak kullanabilir. Yani, anahtar olarak bir tuple, boolean veya dize kullanabilir.


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

Ve değerleri almak için:

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

Veya

name = streetno[3]

Sayıyı anahtar olarak kullanır, dizeleri anahtar olarak kullanmak için sayıların etrafına tırnak işareti koyar.


14

Karma haritalar Python'da yerleşiktir, bunlara sözlükler denir :

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

Kullanımı:

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

Yerleşik yöntemler vb. Gibi daha fazla bilgi için belgelere bakın. Python programlarında harika ve çok yaygınlar (şaşırtıcı değil).


12

İşte Hash Haritası python kullanarak uygulanması Basitlik için karma harita sabit bir boyut 16 olduğunu. Bu kolayca değiştirilebilir. Yeniden şekillendirme bu kodun kapsamı dışındadır.

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

Çıktı:

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

Bence mantığınız kısmen doğru! hash(key) & 15,, 73%15= 13ama eşdeğerdir: 1001001 & 0001111 = 0001111yani 9ve değil 13, mod kullanmak doğru işlem olduğunu düşünüyorum. Eğer Yanlışsam beni düzelt!
Anu

Yine de listeyi nasıl tekrarlıyorsunuz?
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 Sayacı da bu durumda iyi bir seçenektir:

from collections import Counter

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

print(counter)

Bu, listedeki her öğenin sayısı ile bir dikte döndürür:

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

1

Python'da bir sözlük kullanırsınız.

Python'da çok önemli bir tiptir ve sıklıkla kullanılır.

Kolayca bir tane oluşturabilirsiniz.

name = {}

Sözlüklerin birçok yöntemi vardır:

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

Bir diktenin düzenini etkileyemezsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.