Tablica mieszająca (haszowanie) - problem z nadpisywaniem wartości.

0

Cześć.

Próbuję zrobić tablicę z haszowaniem, jednak mam problem.
Kod:

print('Pusta tablica wielkości 10')
tabH = [[] for _ in range(10)]
print (tabH)
print()

def wstawianie(tabH, klucz, wartość):
    kluczH = hash(klucz) % len(tabH)
    czy_istnieje = False
    pozycja = tabH[kluczH]    
    for i, kw in enumerate(pozycja):
        k, w = kw
        if klucz == k:
            czy_istnieje = True 
            break
    if czy_istnieje:
        pozycja[i] = ((klucz, wartość))
    else:
        pozycja.append((klucz, wartość))

print('Wstawianie danych do tablicy')
wstawianie(tabH, 10, 'Truskawka')
wstawianie(tabH, 25, 'Jagoda')
wstawianie(tabH, 20, 'Pomarańcza')
wstawianie(tabH, 32, 'Gruszka')
print (tabH)
wstawianie(tabH, 10, 'Poziomka')
print (tabH)
print()

Chciałbym, aby w przypadku klucza o takim samym numerze (w tym przypadku 10) nie nadpisywało mi wartości, a dodawało ją do listy.

Aktualnie w wyniku otrzymuję:

[[(10, 'Truskawka'), (20, 'Pomarańcza')], [], [(32, 'Gruszka')], [], [], [(25, 'Jagoda')], [], [], [], []]
[[(10, 'Poziomka'), (20, 'Pomarańcza')], [], [(32, 'Gruszka')], [], [], [(25, 'Jagoda')], [], [], [], []]

A chciałbym otrzymać:

[[(10, 'Truskawka'), (20, 'Pomarańcza')], [], [(32, 'Gruszka')], [], [], [(25, 'Jagoda')], [], [], [], []]
[[(10, 'Truskawka', 'Poziomka'), (20, 'Pomarańcza')], [], [(32, 'Gruszka')], [], [], [(25, 'Jagoda')], [], [], [], []]

Czy może mi ktoś pomóc przerobić ten fragment kodu, aby działanie było poprawne?

0
  1. Nie wolno ci zrobić po prostu tabH = [set() for _ in range(10)]?
  2. Jeśli nie, to zacznij od napisania sobie własnej klasy set, która przy dodawaniu sprawdza czy elementu jeszcze nie ma w zbiorze i użyj tej klasy. Bo teraz mieszasz poziomy abstrakcji o stąd kod to jakiś dramat.

Jak masz set to możesz po prostu zrobić

def wstawianie(tabH, klucz, wartość):
    kluczH = hash(klucz) % len(tabH)
    tabH[kluczH].add((klucz, wartość))

i voila

0

Zgadzam się z powyższym, ja bym to zrobił w ogóle inaczej, po co wymyślać na nowo dict, zresztą to nie jest nawet implementacja słownika; nie lepiej użyć wbudowanego i opakować go w klasę? Rozwiązanie najtoporniejsze:

class Table:
	d = {}
	def add(self, key, val):
		if key not in self.d.keys():
			tmp = []
			tmp.append(val)
			self.d[key] = tmp
		else:
			tmp = self.d[key]
			tmp.append(val)
			self.d[key] = tmp
	def __repr__(self):
		return str(self.d)

def main():
	t = Table()
	t.add(42, "A")
	t.add(42, "B")
	t.add(3, "C")
	print(t) # -> {42: ['A', 'B'], 3: ['C']}



if __name__ == "__main__":
    main()

1 użytkowników online, w tym zalogowanych: 0, gości: 1