python字典的逻辑结构包括_python-12-字典详解

list\tuple\str\bytes\bytearray\set\dict

字典 dict

key-value 键值对的数据集合

可变的、无序的、key不重复的

字典dict定义、初始化

d = dict()或者d={}

dict(**kwargs)使用name=value对初始化一个字典,d=dict(a=5,b=6,c=[1,2,3])

数字是可以作为key。

dict(iterable,**kwarg)使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是一个二元结构。

d = dict((1,'a'),(2,'b')) 或者 d = dict(([1,'a'],[2,'b']))

dict(mapping,**kwarg)使用一个字典构造另一个字典

d = {'a':10,'b':20,'c':None,'d':[1,2,3]}

类方法dict.fromkeys(iterable,value)

d = dict.fromkeys(range(5))

d = dict.fromkeys(range(5),0)

在用引用类型,做构造的时候,一定要特别小心。

类方法,相当于java当中的静态方法

字典元素的访问

d[key]

返回key对应的值value

key不存在抛出KeyError异常

get(key[,default])

返回key对应的值value

key不存在返回缺省值,如果没有设置缺省值,就返回None。

这个方法,比较安全,有就返回,没有就返回None,能够用来判断。

setdefault(key[,default])

返回key对应的值value

key不存在,添加kv对,value为default,并返回default,如果default没有设置,缺省为None

get方法和setdefault方法,两个是使用最多的。

f = d2.setdefault(4,400)

f = d2.setdefault(4,401)

setdefault,缺省值,没有就给缺省值,有了就不给了。

连set带get,这个也比较常用。

有时候key不存在出问题,又不想破坏原来值,又拍不存在。

d[key]和get(key[,default])也算是比较常用。

字典的增加和修改

d[key]=value

将key对应的值修改为value

key不存在添加新的kv对

update([other]) -> None

使用另一个字典的kv对更新本字典。

key不存在,就添加

key存在,覆盖已经存在的key对应的值

就地修改

d.update(red=1)

d.update((('red',2),))

d.update({'red':3})

d[100] = 100

d[100] = 1000 # 有就覆盖,没有就创建

字典当中,显示的时候,就是无序的。

元素的修改,就是用key,看似是名称索引。

样子有点像是关联数组那种样子。

update([other])这是要就地修改。

使用另一个字典的kv对更新本字典。

本字典如果有这个key,就带来问题的。

key存在覆盖,不存在就添加。

d3 = {100:2000,5:'abc'}

d2.update(d3,red=1) # 关键字参数,往最后面放,单值往前放

d.update({'red':3}) # 这括号里面是字典

d.update((('red',2),)) # 二元组

字典的构造函数,是很灵活的。

字典元素是kv对的,用法,很不一样

字典删除

pop(key[,default])

key存在,移除它,并返回它的value

key不存在,返回给定的default

default未设置,key不存在则抛出KeyError异常

popitem()

移除并返回一个任意的键值对

字典为empty,抛出KeyError异常

clear()

清空字典

散记:

一个键值对,凑起来,就是item。

d1.pop() # 不行

d1.pop(10)

f = d1.pop(8) # pop出来的,如果是引用类型的,就是一个地址

f.append(4) # 全部都改了

d1

d1.popitem() # 没有参数,一个kv对是返回值,是个二元组。

pop用的很少,popitem用的还是比较多。

kv对,字典做好了,是很少移除的。

而且一边迭代for,一边remove,pop,是不可以的。

字典删除

del语句

a = True

b =[6]

d={'a':1,'b':'b','c':[1,3,4]}

del a # 删除掉,这个对象就没有了。

del d['c'] # 删除了一个对象[1,3,5]?

del b[0]

c=b

del c

del b

b = d['b']

del看起来是删除了一个对象,实际上删除的,是一个引用计数。

本质上减少了一个对象的引用,del实际上删除的是名称,而不是对象

字典遍历(重要)

for ... in dict

遍历key

for k in d:

print(k)

for k in d.keys():

print(k)

遍历value

for k in d:

print(d[k])

for k in d.keys():

print(d.get(k))

item遍历,d.items()

for item in d2.values():

print(item) # 打印value

for v in d2.keys():

print(d2[v])

for item in d.items():

print(item) # 二元组

for k,v in d.items(): # 这里还能够用解构

print(k,v)

for k,_ in d.items():

print(k)

总结:

python3当中,keys、values、items方法,返回一个类似一个生成器的可迭代对象,

实际上是在原集合类型上,进行迭代的。

不会把函数的返回结果赋值到内存中

python2当中,上面的方法会返回一个新的列表,占据新的内存空间。

所以python2建议使用iterkeys,itervalues,iteritems版本,

返回一个迭代器,而不是一个copy

字典

字典是非常常用的数据结构。在任何一个编程语言当中,都很重要。

字典的特性,就是它的key。

for in 里面的解构,情况很多。

字典的key

key的要求和set的元素要求一致

hashable 可哈希,才可以作为key

d = {1:0,2.0:3,'abc':None,('hello','world','python'):'string',b'abc':'135'}

('hello','world','python')和b'abc',不行。

defaultdict - 缺省字典

collection.defaultdict([default_factory[,...]])

第一个参数是default_factory,缺省是None,它提供一个初始化函数。

当key不存在的时候,会调用这个工厂函数来生成key对应的value。

from collections import defaultdict

d1 = {}

d2 = defaultdict(list) # list() list是callable对象 list这里表示个函数名

for k in 'abcde':

for v in range(5):

if k not in d1.keys():

d1[k]=[]

d1[k].append(v)

print(d1)

for k in 'mnopq':

for v in range(3):

d2[k].append(v)

print(d2)

OrderedDict

collections.OrderedDict([items])

key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序

from collections import OrderedDict

import random

d = {'banana':3,'apple':4,'pear':1,'orange':2}

print(d)

keys=list(d.keys())

random.shuffle(keys)

print(keys)

od=OrderedDict()

for key in keys:

od[key]=d[key]

print(od)

print(od.keys())

有序字典,可以记录元素插入的顺序,打印的时候,也是按照这个顺序输出打印的。

3.6版本的python的字典,就是记录key插入的顺序的。

字典练习

第一题

用户输入一个数字

打印每一位数字及其重复的次数

第二题

数字重复统计

随机产生100个整数

数字的范围[-1000,1000]

升序输出所有不同的数字及其重复的次数

第三题

字符串重复统计

字符表'abcdefghijklmnopqrstuvwxyz'

随机挑选2个字母组成字符串,一共挑选100个

降序输出这100个字符串及重复的次数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值