Hash Map ใน Python


144

ฉันต้องการใช้ HashMap ใน Python ฉันต้องการถามผู้ใช้สำหรับอินพุต ฉันกำลังดึงข้อมูลบางอย่างจาก HashMap ขึ้นอยู่กับข้อมูลของเขา หากผู้ใช้ป้อนรหัสของ HashMap ฉันต้องการดึงค่าที่สอดคล้องกัน

ฉันจะใช้ฟังก์ชันนี้ใน 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")

คำตอบ:


246

พจนานุกรม Pythonเป็นชนิดในตัวที่รองรับคู่คีย์ - ค่า

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

รวมถึงการใช้คำสำคัญ dict:

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

หรือ:

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

11
ตัวอย่างที่สองเพียงสร้าง dict ในลักษณะเดียวกับก่อนแล้วคัดลอก การใช้งานอื่น ๆdictซึ่งจะมีการเพิ่มเติมในบริบทนี้คือdict(key1=value1, key2=value2, ...)แต่ที่ต้องใช้คีย์ในการสตริงซึ่งเป็นตัวบ่งชี้ Python ที่ถูกต้อง (และภายในเป็นการสร้างพจนานุกรมด้วย)

น่าสนใจฉันไม่ทราบว่าสตริงเปล่าเป็นตัวระบุที่ถูกต้อง
Alan

ฉันไม่แน่ใจว่าฉันเข้าใจคุณถูกต้องหรือไม่ ("สตริงเปลือย" คืออะไร) แต่ฉันเชื่อว่าคุณได้รับมันกลับมา ตัวอย่างที่สองที่อัปเดตของคุณไม่ถูกต้องและฉันไม่เคยตั้งใจที่จะบอกว่างานนั้นเป็นแบบนั้น ข้อโต้แย้งคำหลักไวยากรณ์ซึ่งยอมรับเพียงตัวระบุเปลือยกายภายในใช้พจนานุกรม ตัวdictสร้างสนับสนุนข้อโต้แย้งคำหลักและทำงานเช่นdef dict(**kwds): return kwdsถ้าได้รับข้อโต้แย้งคำหลัก

ตัวอย่างที่สองทำให้เกิดข้อผิดพลาดทางไวยากรณ์ ชื่อตัวแปรไม่สามารถเริ่มต้นด้วยตัวเลข
Simon Bergot

ใช่ดูเหมือนว่า "แผนที่" และมันทำหน้าที่เหมือน "แผนที่" แต่คำถามไม่ใช่ "Map in Python" แต่ "Hash Map in Python": พจนานุกรมเป็น hash (!) หรือไม่?
309963d8521805330a44bdcb3d87f3

27

สิ่งที่คุณต้องการ (ในเวลาที่คำถามถูกถามเดิม) เป็นคำใบ้ ต่อไปนี้เป็นคำแนะนำ: ในหลามคุณสามารถใช้พจนานุกรม


24

มันมีอยู่แล้วภายในสำหรับ Python ดูพจนานุกรม

ตามตัวอย่างของคุณ:

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

จากนั้นคุณสามารถเข้าถึงได้โดย:

sachine = streetno["1"]

ด้วยมูลค่าการกล่าวขวัญ: มันสามารถใช้ชนิดข้อมูลใด ๆ ที่ไม่แน่นอนเป็นคีย์ นั่นคือมันสามารถใช้ tuple บูลีนหรือสตริงเป็นคีย์


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

และเพื่อรับค่า:

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

หรือ

name = streetno[3]

นั่นคือการใช้ตัวเลขเป็นคีย์ใส่เครื่องหมายคำพูดล้อมรอบตัวเลขเพื่อใช้สตริงเป็นคีย์


14

แผนที่แฮชมีในตัวใน Python มันถูกเรียกว่าพจนานุกรม :

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

การใช้งาน:

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

ดูเอกสารประกอบสำหรับข้อมูลเพิ่มเติมเช่นวิธีการในตัวและอื่น ๆ พวกมันยอดเยี่ยมมากและพบได้ทั่วไปในโปรแกรม Python (ไม่แปลกใจ)


12

นี่คือการใช้งาน Hash Map โดยใช้ python สำหรับความเรียบง่ายของ Hash Map นั้นมีขนาดคงที่ 16 ซึ่งสามารถเปลี่ยนแปลงได้ง่าย การล้างข้อมูลไม่อยู่ในขอบเขตของรหัสนี้

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

เอาท์พุท:

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

ฉันคิดว่าตรรกะของคุณถูกต้องบางส่วน! hash(key) & 15, 73%15= 13แต่มันเทียบเท่า: 1001001 & 0001111 = 0001111คือ9ไม่13ผมคิดว่าใช้ mod เป็นการดำเนินการที่ถูกต้อง ถูกต้องฉันถ้าฉันผิด!
Anu

คุณทำซ้ำผ่านรายการอย่างไร?
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เป็นตัวเลือกที่ดีในกรณีนี้:

from collections import Counter

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

print(counter)

สิ่งนี้จะคืนค่าพจน์ที่มีจำนวนองค์ประกอบแต่ละตัวในรายการ

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

1

ในงูหลามคุณจะใช้พจนานุกรม

มันเป็นชนิดที่สำคัญมากในงูหลามและมักจะใช้

คุณสามารถสร้างได้อย่างง่ายดายโดย

name = {}

พจนานุกรมมีวิธีการมากมาย:

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

คุณไม่สามารถมีอิทธิพลต่อคำสั่งของ dict

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.