Mapa Hash em Python


144

Eu quero implementar um HashMap em Python. Quero pedir uma entrada ao usuário. dependendo da entrada dele, estou recuperando algumas informações do HashMap. Se o usuário digitar uma chave do HashMap, eu gostaria de recuperar o valor correspondente.

Como implemento essa funcionalidade no 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")

Respostas:


246

O dicionário Python é um tipo interno que suporta pares de valores-chave.

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

além de usar a palavra-chave dict:

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

ou:

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

11
O segundo exemplo apenas cria um ditado da mesma maneira que antes e depois o copia. O outro uso dict, que seria mais apropriado nesse contexto, é dict(key1=value1, key2=value2, ...)que requer as chaves para as strings que também são identificadores Python válidos (e internamente, isso também cria um dicionário).

Ah, interessante, eu não sabia que strings nuas eram identificadores válidos.
Alan

Não sei se entendi direito (o que são "cordas nuas"?), Mas acredito que você entendeu o contrário. Seu segundo exemplo atualizado é inválido e nunca pretendi declarar algo parecido com esse trabalho. A sintaxe dos argumentos da palavra-chave , que aceita apenas identificadores simples, usa internamente um dicionário. O dictconstrutor suporta argumentos de palavras-chave e funciona como def dict(**kwds): return kwdsse fossem dados argumentos de palavras-chave.

o segundo exemplo gera um erro de sintaxe. nomes de variáveis não pode começar com um número
Simon Bergot

Sim, parece um "mapa" e funciona como um "mapa". Mas a questão não é "Map in Python", mas "Hash Map in Python": os dicionários são um mapa de hash (!)?
309963d8521805330a44bdcb3d87f3 14/01

27

Tudo o que você queria (no momento em que a pergunta foi feita originalmente) era uma dica. Aqui está uma dica: No Python, você pode usar dicionários .


24

Está embutido no Python. Veja dicionários .

Com base no seu exemplo:

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

Você pode acessá-lo assim:

sachine = streetno["1"]

Também vale a pena mencionar: ele pode usar qualquer tipo de dados não mutável como chave. Ou seja, ele pode usar uma tupla, booleano ou string como chave.


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

E para recuperar valores:

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

Ou

name = streetno[3]

Isso é usar número como chaves, colocar aspas ao redor dos números para usar cadeias de caracteres como chaves.


14

Os mapas de hash são integrados no Python, chamados dicionários :

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

Uso:

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

Consulte a documentação para obter mais informações, por exemplo, métodos internos e assim por diante. Eles são ótimos e muito comuns em programas Python (sem surpresa).


12

Aqui está a implementação do Hash Map usando python. Para simplificar, o mapa de hash tem um tamanho fixo 16. Isso pode ser alterado facilmente. A reformulação está fora do escopo deste código.

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

Resultado:

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

Eu acho que sua lógica está parcialmente correta! hash(key) & 15, 73%15= 13, Mas é equivalente: 1001001 & 0001111 = 0001111ou seja, 9e não 13, eu acho que usar mod é a operação correta. Corrija-me se eu estiver errada!
Anu

Como você percorre a lista?
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 também é uma boa opção neste caso:

from collections import Counter

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

print(counter)

Isso retorna um ditado com a contagem de cada elemento na lista:

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

1

Em python, você usaria um dicionário.

É um tipo muito importante em python e frequentemente usado.

Você pode criar um facilmente

name = {}

Os dicionários têm muitos métodos:

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

Você não pode influenciar a ordem de um ditado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.