各位用户为了找寻关于python利用拉链法实现字典方法示例的资料费劲了很多周折。这里教程网为您整理了关于python利用拉链法实现字典方法示例的相关资料,仅供查阅,以下为您介绍关于python利用拉链法实现字典方法示例的详细内容
前言
字典也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1),下面这篇文章就来给大家介绍介绍python利用拉链法实现字典的方法。
在Python中怎样用列表实现字典?
用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办?
最简单的办法就是使用拉链法.
拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好,
num的数足够大,就能够保证列表中的每一个列表里面只有一个元素。根据key计算的元素所在的位置,然后来取值就能达
到O(1)的时间。
方法示例
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56class
MyDict:
def
__init__(
self
, num
=
100
):
# 指定列表大小
self
._num
=
num
self
._lst
=
[]
for
_
in
range
(
self
._num):
self
._lst.append([])
def
update(
self
, key, value):
# 添加 key-value
key_index
=
hash
(key)
%
self
._num
for
i, (k, v)
in
enumerate
(
self
._lst[key_index]):
if
key
=
=
k:
self
._lst[key_index][i]
=
[key, value]
break
else
:
self
._lst[key_index].append([key, value])
def
get(
self
, key):
# 根据指定的 key 弹出值
key_index
=
hash
(key)
%
self
._num
for
k, v
in
self
._lst[key_index]:
if
k
=
=
key:
return
v
else
:
raise
KeyError(
'No such {} key'
.
format
(key))
def
pop(
self
, key):
# 根据 key 弹出元素 并且删除
key_index
=
hash
(key)
%
self
._num
for
i, (k, v)
in
enumerate
(
self
._lst[key_index]):
if
k
=
=
key:
result
=
v
self
._lst.pop(i)
return
result
else
:
raise
KeyError(
'No such {} key'
.
format
(key))
def
__getitem__(
self
, key):
# 可以通过下标来取值
key_index
=
hash
(key)
%
self
._num
for
k, v
in
self
._lst[key_index]:
if
k
=
=
key:
return
v
else
:
raise
KeyError(
'No such {} key'
.
format
(key))
def
keys(
self
):
# 取得所有的key
for
index
in
range
(
self
._num):
for
k, v
in
self
._lst[index]:
yield
k
def
values(
self
):
# 取得所有的 value
for
index
in
range
(
self
._num):
for
k, v
in
self
._lst[index]:
yield
v
def
items(
self
):
# 取得所有的条目
for
index
in
range
(
self
._num):
for
item
in
self
._lst[index]:
yield
item
通过key查到的时间,可见下图
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。