পাইথনে হ্যাশ ম্যাপ


144

আমি পাইথনে একটি হ্যাশম্যাপ বাস্তবায়ন করতে চাই। আমি কোনও ব্যবহারকারীকে একটি ইনপুট চাইতে চাই। তার ইনপুটটির উপর নির্ভর করে আমি হ্যাশম্যাপ থেকে কিছু তথ্য উদ্ধার করছি। যদি ব্যবহারকারী হ্যাশম্যাপের একটি কী প্রবেশ করে তবে আমি সংশ্লিষ্ট মানটি পুনরুদ্ধার করতে চাই।

পাইথনে আমি এই কার্যকারিতাটি কীভাবে বাস্তবায়ন করব?

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

পাইথন অভিধানটি একটি অন্তর্নির্মিত প্রকার যা মূল-মান জুটিকে সমর্থন করে pairs

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

পাশাপাশি ডিক কীওয়ার্ডটি ব্যবহার করে:

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

বা:

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

11
দ্বিতীয় উদাহরণটি কেবল আগের মতো একটি ডিক তৈরি করে এবং তারপরে অনুলিপি করে। অন্য ব্যবহার dict, যা এই প্রসঙ্গে আরও উপকারী হবে, dict(key1=value1, key2=value2, ...)তবে তার জন্য স্ট্রিংগুলির কীগুলি দরকার যা বৈধ পাইথন শনাক্তকারী (এবং অভ্যন্তরীণভাবে এটিও একটি অভিধান তৈরি করে)।

আহ আকর্ষণীয়, আমি বুঝতে পারি নি যে নগ্ন স্ট্রিংগুলি বৈধ শনাক্তকারী ছিল।
অ্যালান

আমি আপনাকে সঠিকভাবে বুঝতে পেরেছি কিনা তা নিশ্চিত নই ("নগ্ন স্ট্রিংগুলি কী কী?") তবে আমি বিশ্বাস করি আপনি এটি পেছনের দিকে পেয়েছেন। আপনার আপডেট হওয়া দ্বিতীয় উদাহরণটি অবৈধ এবং আমি কখনই সেই কাজের মতো কিছু বর্ণনা করার ইচ্ছা করি নি। শব্দ আর্গুমেন্ট সিনট্যাক্স, যা গ্রহণ করে শুধুমাত্র নগ্ন সনাক্তকারীগুলি অভ্যন্তরীণভাবে একটি অভিধান ব্যবহার করে। dictকন্সট্রাকটর সমর্থন শব্দ আর্গুমেন্ট মত কাজ def dict(**kwds): return kwdsকরে শব্দ আর্গুমেন্ট দেওয়া।

দ্বিতীয় উদাহরণ একটি বাক্য গঠন ত্রুটি উত্থাপন করে। পরিবর্তনশীল নামগুলি একটি সংখ্যা দিয়ে শুরু করতে পারে না
সাইমন বার্গোট

হ্যাঁ, এটি "মানচিত্রের" মতো লাগে এবং এটি একটি "মানচিত্র" এর মতো কাজ করে। তবে প্রশ্নটি "পাইথন-এ ম্যাপ" নয় বরং "পাইথনে হ্যাশ ম্যাপ": অভিধানগুলি কি হ্যাশ (!) মানচিত্র?
309963d8521805330a44bdcb3d87f3

27

আপনি যা চেয়েছিলেন (সমস্ত সময়ে মূলত প্রশ্নটি জিজ্ঞাসা করা হয়েছিল) কেবল ইঙ্গিত ছিল। এখানে একটি ইঙ্গিত দেওয়া হয়েছে: পাইথনে, আপনি অভিধান ব্যবহার করতে পারেন ।


24

এটি পাইথনের জন্য অন্তর্নির্মিত। অভিধান দেখুন ।

আপনার উদাহরণের ভিত্তিতে:

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

আপনি তখন এটির মতো অ্যাক্সেস করতে পারতেন:

sachine = streetno["1"]

উল্লেখ করার মতো: এটি কোনও অ-পরিবর্তনীয় ডেটা টাইপকে কী হিসাবে ব্যবহার করতে পারে। এটি, কী হিসাবে টিপল, বুলিয়ান বা স্ট্রিং ব্যবহার করতে পারে।


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

এবং মানগুলি পুনরুদ্ধার করতে:

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

অথবা

name = streetno[3]

এটি কী হিসাবে সংখ্যা ব্যবহার করছে, কী হিসাবে স্ট্রিংগুলি ব্যবহার করার জন্য সংখ্যার চারপাশে উদ্ধৃতি রাখুন।


14

হ্যাশ ম্যাপগুলি পাইথনে অন্তর্নির্মিত, এগুলিকে অভিধান বলা হয় :

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"

আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন, যেমন অন্তর্নির্মিত পদ্ধতি এবং এই জাতীয়। এগুলি দুর্দান্ত এবং পাইথন প্রোগ্রামগুলিতে খুব সাধারণ (আশ্চর্যজনকভাবে)।


12

পাইথন ব্যবহার করে হ্যাশ মানচিত্রটির বাস্তবায়ন এখানে রয়েছে সরলতার জন্য হ্যাশ মানচিত্রটি একটি নির্দিষ্ট আকারের 16 হয় This এটি সহজেই পরিবর্তন করা যায়। পুনঃভাগ করা এই কোডের আওতার বাইরে।

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, আমি মনে করি মোড ব্যবহার করা সঠিক ক্রিয়াকলাপ। আমি ভুল হলে আমাকে সংশোধন কর!
অনু

আপনি কিভাবে তালিকা মাধ্যমে পুনরাবৃত্তি করবেন?
পেট্রো

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

পাইথন কাউন্টার এই ক্ষেত্রে একটি ভাল বিকল্প:

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

আপনি কোনও ডিকের ক্রমকে প্রভাবিত করতে পারবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.