Python内置数据结构之Dict

字典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())

猜你喜欢

转载自blog.csdn.net/qq_35976427/article/details/89099278