欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python内置数据结构之Dict

程序员文章站 2022-05-19 14:21:07
...

字典dict:

  • key-value键值对的数据的集合
  • 可变的、无序的、key不重复

字典dict定义 初始化:

  • d=dict() 或者 d={}
  • dict(**kwargs)使用name=value对初始化一个字典
  • 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):

dict.fromkeys(range(3),9)
{0: None, 1: None, 2: None}
dict.fromkeys(range(3),9)
{0: 9, 1: 9, 2: 9}
=============================================================
id(a[1])
8731280
id(a[2])
8731280

字典元素的访问:

d[key]
    返回key对应的值value
    key不存在抛出keyError异常

c[50]
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-20-32f12499b2ed> in <module>
----> 1 c[50]

KeyError: 50

get(key[,default]) #如果配置文件找不到默认给个缺失值
    返回key对应的值value
    key 不在在返回缺省值,如果没有设置缺省值就返回None

c = dict.fromkeys(range(5),[80])
{0: [80], 1: [80], 2: [80], 3: [80], 4: [80]}
c.get(80,50)
50

setdefault(key[,default])
    返回key对应的值value
    key不存在,添加kv对,value为default,并返回default,如果default没有设置,缺省为None

c.setdefault(80)
{0: [80], 1: [80], 2: [80], 3: [80], 4: [80], 80: None}

字典增加和修改:

d[key]=value
    将key对应的值修改为value
    key不存在添加新的kv对

c[50] = 50
{0: [80], 1: [80], 2: [80], 3: [80], 4: [80], 80: None, 50: 50}

update([other])->None
    使用另一个字典的kv对更新本字典
    key不存在,就添加
    key存在,覆盖已经存在的key 对应的值

d = dict.fromkeys(range(10,13),'r')
{0: None, 1: None, 2: None, 3: [80], 4: [80], 80: None, 50: 50}
c.update(d)
{0: None, 1: None, 2: None,3: [80],4: [80],80: None,50: 50,10: 'r',11: 'r',12: 'r'}

字典删除:

pop(key[,default])
    key存在,移除它,并返回它的value
    key不存在,返回给定的default
    default未设置,key不存在则抛出keyError异常

c = {0: None, 1: None, 2: None,3: [80],4: [80],80: None,50: 50,10: 'r',11: 'r',12: 'r'}

c.pop(12)
'r'
{0:None,1: None,2: None,3: [80],4: [80],80: None,50: 50,10: 'r',11: 'r'}


c.pop(13,'xixi')
'xixi'


c.pop(13)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-31-38129fbdd614> in <module>
      1 #{0: None, 1: None, 2: None,3: [80],4: [80],80: None,50: 50,10: 'r',11: 'r',12: 'r'}
----> 2 c.pop(13)

KeyError: 13

popitem()#随机删除
    移除并返回一个任意的键值对
    字典为empyt,抛出异常keyError异常

c.popitem()
(0,None)
{1: None, 2: None, 3: [80], 4: [80], 80: None, 50: 50, 10: 'r'}
c.popitem()
(10, 'r')

clear()
    清空字典

字典遍历:

c = {1: None, 2: None, 3: [80], 4: [80], 80: None, 50: 50}
for i in c:
    print(i)
1
2
3
4
80
50
    
for i in c.keys():
    print(i)
1
2
3
4
80
50

for i in c.values():
    print(i)
None
None
[80]
[80]
None
50

遍历item,即kv对:

for key in c.items():
    print(key)
    
(1, None)
(2, None)
(3, [80])
(4, [80])
(80, None)
(50, 50)

for k,v in c.items():
    print(k,v)
    
1 None
2 None
3 [80]
4 [80]
80 None
50 50
  • 字典不可以在for中增加或者删除

  • 如果想删除,把keys存入列表中,在循环列表用pop删除字典中的值

  • BTW
    del 用作删除引用计数

缺省字典 defaultdict:

collections.defaultdict([default_factory[,…]])
    第一个参数是default_factory,缺省是None,它提供一个初始化函数。当key不存在的时候,会调用这个工厂函数来生成key对应的value

mport random
d1={}
for k in 'abcdef':
    for i in range(random.randint(1,5)):
        if k not in d1.keys():
            d1[k] = []
        d1[k].append(i)
print(d1)
{'a': [0, 1, 2], 'b': [0, 1], 'c': [0], 'd': [0, 1, 2], 'e': [0, 1, 2, 3], 'f': [0, 1, 2]}

defaultdict工厂函数:
		
from collections import defaultdict
import random

d1=defaultdict(list)
for k in 'abcdef':
    for i in range(random.randint(1,5)):
        d1[k].append(i)
d1
defaultdict(list,{'a': [0],'b': [0, 1],'c': [0, 1],'d': [0, 1],'e': [0, 1, 2, 3],'f': [0, 1, 2]})

有序字典OrderedDict:

    有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
    3.6版本的Python的字典就是记录key插入的顺序

from collections import OrderedDict
import random
d = {'a':4,'b':5,'c':6,'r':7}
print(d)
keys = list(d.keys())
print(keys)
random.shuffle(keys)
print(keys)
od = OrderedDict()
for key in keys:
    od[key] = d[key]
print(od)
print(od.keys())