python dict key类型_Python-基础类型dict

用途

按key:value的形式存放多个任意类型的value,key反映的是value的属性

因为字典的key是不能重复的,所以我们也可以利用这个特点来去重

定义方式

在{}内用逗号分隔开多个key:value,其中value可以是任意类型,而key必须是不可变的类型,通常是字符串类型。若key为可变类型,会报错显示unhashable,确切的说,字典的key是必须要有__hash__属性的对象,以下为一个实验例子。

a = [1,2,3]

d = {a:a}

---------------

TypeError: unhashable type: 'list'

报错显示,list不是一个可以hash的类,查看list源码,发现hash方法为None,而str型中,hash方法有定义

# 部分源码

class object:

""" The most base type """

def __hash__(self, *args, **kwargs): # real signature unknown

""" Return hash(self). """

pass

'''

list类的源码中,__hash__设置了为None,所以虽然继承了object类,但是对于list来说,优先使用自己类中的

__hash__

'''

class list(object):

__hash__ = None

# 相同情况的还有set与dict

class set(object):

__hash__ = None

class dict(object):

__hash__ = None

我们发现,设置为None值的三个类型正好是仅有的三个可变类型。所以key必须是不可变类型

字典的key是唯一的

利用这一特点,我们可以利用字典来去重

d={'k1':111,'k1':222,'k1':333} # key重复,只保留一个最后一个

d1={'k1':333,'k1':222,'k1':111}

print(d)

print(d1)

------------------

{'k1': 333}

{'k1': 111}

生成字典

# 生成字典的方式1

l=[("name","egon"),("age",18),["gender","male"]]

res=dict(l)

print(res)

# 生成字典的方式2

d=dict(x=1,y=2,z=3)

print(d)

------------------------------------------

{'name': 'egon', 'age': 18, 'gender': 'male'}

{'x': 1, 'y': 2, 'z': 3}

# 生成字典的方式3

'''

通常利用fromkeys生成字典的值都设置为None,当然也可以是其他类型,不过不要设置为可变类型,因为此处的value存的是一个内存地址,如果是可变类型,当我们向其中添加数时,会使得所有的key对应的value都指向同一个可变类型。

'''

d1 = dict.fromkeys(('x', 'y', 'z'), None)

d2 = dict.fromkeys(['x', 'y', 'z'], None)

d3 = dict.fromkeys('xyz', None)

print(d1)

print(d2)

print(d3)

------------------------------

{'x': None, 'y': None, 'z': None}

{'x': None, 'y': None, 'z': None}

{'x': None, 'y': None, 'z': None}

"""

针对上一个注释,通过下面的小练习可以更好的理解

小练习:

res = {}.fromkeys(['k1','k2','k3'],[])

res.get('k1').append(123)

print(res)的结果是?

A:{'k1': [123], 'k2': [], 'k3': []}

B:{'k1': [123], 'k2': [123], 'k3': [123]}

C:报错

D:我TMD的也不知道

"""

答案:B

# 空字典

d={}

print(type(d))

字典去重

# 注意,字典本身是无序的,我们看到打印出来和原来的顺序一样是因为pycharm的优化

list1 = [1, 2, 3, 3, 4, 5, 5, 6]

d = dict.fromkeys(list1, None)

list1 = list(d)

print(d)

print(list1)

---------------------------

{1: None, 2: None, 3: None, 4: None, 5: None, 6: None}

[1, 2, 3, 4, 5, 6]

常用操作+内置的方法

优先掌握的操作:

字典取值

若key存在就取值,如不存在就加值,取值最好用get方法

# 直接利用key取值,若key不存在则报错

d = {'k1': 111, 'k2': 222}

print(d['k1'])

# print(d['k3']) # KeyError: 'k3'

-------------------

111

# 利用get取值,若不存在返回None

d = {'k1': 111, 'k2': 222}

print(d.get('k1'))

print(d.get('k3'))

------------------

111

None

# 利用get取值还可以自定义找不存在的key时的返回值,若不设置,默认返回None

d = {'k1':111,'k2':222}

res = d.get('k3','找一个存在的键啊,蠢蛋')

print(res) # 键不存在 返回get方法里面第二个参数

------------------------------------

找一个存在的键啊,蠢蛋

字典新增键值对

"""方式一:直接利用key"""

d = {'username': 'yang', 'password': 123}

d['hobby'] = 'study' # 字典的key不存在新增

print(d)

d['username'] = 'king'

print(d) # 字典的key存在则修改

----------------------------------------------

{'username': 'yang', 'password': 123, 'hobby': 'study'}

{'username': 'king', 'password': 123, 'hobby': 'study'}

"""方式二,update,特点与方法一相同,存在key就修改,不存在就添加,此处key为字符串"""

d = {'username': 'yang', 'password': 123}

d.update(hobby = 'study')

print(d)

d.update(username = 'king')

print(d)

-------------------------------

{'username': 'yang', 'password': 123, 'hobby': 'study'}

{'username': 'king', 'password': 123, 'hobby': 'study'}

# 若使用update方法,新增的key是一个变量,那么需要使用{:}的形式添加

x = 'xxx'

d = {'username': 'yang', 'password': 123}

d.update({x: 123}) # 注意这个花括号不能少

print(d)

-------------------------------

{'username': 'yang', 'password': 123, 'xxx': 123}

"""方式3 setdefault

键如果存在的情况下 那么不做修改 而是将对应的value取出

键如果不存在的情况下 那么就是新增

"""

d = {'username': 'yang', 'password': 123}

d.setdefault('xxx',123)

print(d) # 键不存在是新增

res = d.setdefault('username',123)

print(d)

print(res)

------------------------

{'username': 'yang', 'password': 123, 'xxx': 123}

{'username': 'yang', 'password': 123, 'xxx': 123}

yang

清空clear

d = {'k1': 111, 'k2': 222}

d.clear()

print(d)

-----------

{}

长度len

d={'k1':111,'k2':222}

print(len(d))

------------

2

成员运算in和not in

d={'k1':111,'k2':222}

print('k1' in d)

print(111 in d)

--------------------

True

False

删除

万能删除del

万能删除,没有返回值,代表的是单纯的删除

d={'k1':111,'k2':222}

del d['k1']

print(d)

------------

{'k2': 222}

随机删除popitem

返回一个元组

d = {'k1':111,'k2':222,'k3':333}

res = d.popitem()

print(d,res)

-----------------------

{'k1': 111, 'k2': 222} ('k3', 333)

取走操作pop

指定key删除,有返回值,代表的是取走操作。与列表不同的是,列表不写参数或默认取走最后一个元素,在字典中,必须要传参数,不然会直接报错。

d={'k1':111,'k2':222}

res=d.pop('k1')

print(d)

print(res)

-----------------------------

{'k2': 222}

111

键keys(),值values(),键值对items() 与for循环

# 键keys(),值values(),键值对items() 与for循环

d = {'k1':111,'k2':222,'k3':333}

for key in d.keys():

print(key,end=' ')

print()

for value in d.values():

print(value,end=' ')

print()

for k,v in d.items():

print(k,v)

---------------------------------

k1 k2 k3

111 222 333

k1 111

k2 222

k3 333

Python3 字典 keys() 方法返回一个可迭代对象,可以使用 list() 来转换为列表。可以获取字典中所有的键并利用list方法强转为列表

d = {'k1':111,'k2':222,'k3':333}

res1 = d.keys()

res1_iter = res1.__iter__() # 返回值拥有__iter__方法。说明是一个可迭代对象

print(res1,res1_iter)

-----------------------------------------------

dict_keys(['k1', 'k2', 'k3'])

# 若要获取字典中所有的key,并存入列表

d = {'k1':111,'k2':222,'k3':333}

res = d.keys()

res1 = list(res)

print(res1)

----------------------

['k1', 'k2', 'k3']

Python 字典 values() 方法也返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有值。要将值存入列表的方法同上。

d = {'k1':111,'k2':222,'k3':333}

res1 = d.values()

res1_iter = res1.__iter__() # 返回值拥有__iter__方法。说明是一个可迭代对象

print(res1,res1_iter)

------------------------------------------

dict_values([111, 222, 333])

Python 字典 items() 方法也返回一个可迭代对象。也可以利用list方法转为字典,不过其中的值为元组

d = {'k1':111,'k2':222,'k3':333}

res1 = d.items()

res1_iter = res1.__iter__() # 返回值拥有__iter__方法。说明是一个可迭代对象

print(res1,res1_iter)

------------------------------------

dict_items([('k1', 111), ('k2', 222), ('k3', 333)])

# 利用list方法

res1 = list(res)

print(res1)

-----------------------------------

[('k1', 111), ('k2', 222), ('k3', 333)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值