Bản đồ băm trong Python


144

Tôi muốn triển khai HashMap trong Python. Tôi muốn hỏi một người dùng cho một đầu vào. tùy thuộc vào đầu vào của anh ta, tôi đang lấy một số thông tin từ HashMap. Nếu người dùng nhập khóa của HashMap, tôi muốn lấy giá trị tương ứng.

Làm cách nào để triển khai chức năng này trong 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")

Câu trả lời:


246

Từ điển Python là một loại tích hợp hỗ trợ các cặp khóa-giá trị.

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

cũng như sử dụng từ khóa dict:

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

hoặc là:

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

11
Ví dụ thứ hai chỉ xây dựng một dict theo cách tương tự như trước và sau đó sao chép nó. Việc sử dụng khác dict, sẽ phù hợp hơn trong ngữ cảnh này, dict(key1=value1, key2=value2, ...)nhưng yêu cầu các khóa cho chuỗi cũng là định danh Python hợp lệ (và bên trong, điều này cũng tạo ra một từ điển).

Thật thú vị, tôi đã không nhận ra rằng các chuỗi trần là các định danh hợp lệ.
Alan

Tôi không chắc là tôi có hiểu đúng về bạn không ("chuỗi trần" là gì?), Nhưng tôi tin rằng bạn đã hiểu điều đó. Ví dụ thứ hai được cập nhật của bạn không hợp lệ và tôi không bao giờ có ý định nêu điều gì đó giống như công việc đó. Các đối số từ khóa cú pháp, mà chấp nhận chỉ định khỏa thân, nội bộ sử dụng một từ điển. Hàm dicttạo hỗ trợ các đối số từ khóa và hoạt động như def dict(**kwds): return kwdsnếu các đối số từ khóa được cung cấp.

ví dụ thứ hai làm tăng lỗi cú pháp. tên biến không thể bắt đầu bằng một số
Simon Bergot

Vâng, nó trông giống như một "bản đồ" và nó hoạt động như một "bản đồ". Nhưng câu hỏi không phải là "Bản đồ trong Python" mà là "Bản đồ băm trong Python": Từ điển có phải là bản đồ băm (!) Không?
309963d8521805330a44bdcb3d87f3

27

Tất cả những gì bạn muốn (tại thời điểm câu hỏi ban đầu được hỏi) là một gợi ý. Đây là một gợi ý: Trong Python, bạn có thể sử dụng từ điển .


24

Nó được tích hợp sẵn cho Python. Xem từ điển .

Dựa trên ví dụ của bạn:

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

Sau đó bạn có thể truy cập nó như vậy:

sachine = streetno["1"]

Cũng đáng đề cập: nó có thể sử dụng bất kỳ loại dữ liệu không thể thay đổi nào làm khóa. Đó là, nó có thể sử dụng một tuple, boolean hoặc chuỗi làm khóa.


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

Và để lấy các giá trị:

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

Hoặc là

name = streetno[3]

Đó là sử dụng số làm khóa, đặt dấu ngoặc kép quanh các số để sử dụng chuỗi làm khóa.


14

Bản đồ băm được tích hợp sẵn trong Python, chúng được gọi là từ điển :

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

Sử dụng:

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

Xem tài liệu để biết thêm thông tin, ví dụ: các phương thức tích hợp, v.v. Chúng rất tuyệt và rất phổ biến trong các chương trình Python (không ngạc nhiên).


12

Dưới đây là việc triển khai Bản đồ băm bằng python Vì bản đồ băm đơn giản có kích thước cố định 16. Điều này có thể thay đổi dễ dàng. Việc làm lại nằm ngoài phạm vi của mã này.

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

Đầu ra:

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

Tôi nghĩ logic của bạn là một phần chính xác! hash(key) & 15, 73%15= 13nhưng nó tương đương: 1001001 & 0001111 = 0001111tức là 9và không 13, tôi nghĩ sử dụng mod là thao tác chính xác. Đúng nếu tôi đã sai lầm!
Anu

Làm thế nào để bạn lặp qua danh sách mặc dù?
Dầu khí

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 cũng là một lựa chọn tốt trong trường hợp này:

from collections import Counter

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

print(counter)

Điều này trả về một dict với số lượng của từng yếu tố trong danh sách:

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

1

Trong python bạn sẽ sử dụng một từ điển.

Nó là một loại rất quan trọng trong python và thường được sử dụng.

Bạn có thể tạo một cách dễ dàng bằng cách

name = {}

Từ điển có nhiều phương pháp:

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

Bạn không thể ảnh hưởng đến thứ tự của một dict.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.