Python-数据结构之dict(字典*****)

189 阅读4分钟

转载:www.cnblogs.com/JerryZao/p/… 阅读目录:

1、字典dict

2、字典dict定义,初始化****

3、字典元素的访问

4、字典增加和修改

5、字典删除

6、字典的遍历

7、字典遍历 和 移除

8、字典的key

9、defaultdict (缺省字典)

10、OrderedDict 有序字典

1、字典dict

  key_value 键值对的数据的集合

  可变,无序,key不重复,非线性

2、字典dict定义,初始化

  d = dict() 或者 d = {}

  dict(**kwargs) 使用name=value 对初始化一个字典

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

 注意!

 

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

  dict(mapping, **kwarg)) 使用一个字典构造另一个字典 # 注意引用类型

  d = {'a':1, 's':2, 'd':None,'f':[1,2,3]}

  类方法:dict.fromkeys(iterable,value) # 注意引用类型   

 test-定义初始化**

 练习

 

3、字典元素的访问

  d[key]:返回key对应的值value,key不存在怕熬出KeyError异常

  get(key [, default]) : 返回key对应的值value,可以不存在返回缺省值,如果没有设置缺省值,就返回None

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

 test


4、字典增加和修改
d[ke] = value

    将key 对应的值修改为value

    key 不存在添加新的 K-V对

  update([other])  ---> None

    使用另一个字典的K-V对更新本字典

    key 不存在,就添加

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

    就地修改

 test

 

5、字典删除:

  pop( key [, default] )

    key 存在,移除,并返回None  

    key 不存在,返回给定的 default

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

  popitem():

    随意移除并返回一个K-V对

    字典为空,抛出异常

  clear()

  del 语句 

   注:理论上删除的是对象的引用,而不是对象。

 test

 

复制代码

 1 a = True
 2 b = [6]
 3 d = {'b':b,'c':[1,3,4]}
 4 del a
 5 del d['c']
 6 del b
 7 d # 'b': [6]} 即便删了b,但是[6] 还是存在的,而且被d['b']引用,放的是地址,而不是b 这个标识符
 8 
 9 c = b
10 del c
11 del b
12 
13 del a['c'] # 看着像删除了一个对象,本质上减少了一个对象引用,del实际上删除的是名称,而不是对象

复制代码

 

  

6、字典的遍历:

  for ... in dict

    遍历key  #  list(d) ---得到的是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[k])

      for v in d.values():

        print(v)

    遍历K-V 对 item

      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 方法返回一个类似的一个生成器的可迭代对象,不会把函数的返回结果复制到内存中。

          Dictionary view 对象 ,可以使用len() ,iter() , in 操作

        字典的entry的动态的视图,字典变化,试图将反映出这些变化。(entry就是 item)

        keys返回一个类set对象,也就是可以看做一个set 集合,如果valuse 都可以hash,那么items 也可以看做是类 set 对象

 

      Python 2 中,上面的方法会返回一个新的列表,占据新的内存空间,索引Python2 中建议使用iterkeys. itervalues,iteritems版本,返回一个迭代器,而不是一个copy

7、字典遍历 和 移除:

  如何在遍历的时候移除元素(结论是,字典不能再遍历本身的时候删除)

复制代码

 1 正确的做法:现将需要的 keys 取出来,在迭代keys ,从而删除 pop(key) 
 2 d = dict(a=1,b=2,c=3)
 3 keys = []
 4 for k, v in d.items():
 5     if isinstance(v, str):
 6         keys.append(k)
 7 
 8 for k in keys:
 9     d.pop(k)
10 print(d)

复制代码

 

 

8、字典的key

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

    set 的元素 可以 就是看做 key,set可以看到 dict的简化版。

    hashable 可哈希才可以作为key,可以使用hasn() 测试。

    d = { 1:0 , 2.0:3, 'abc': None}

 

9、defaultdict (缺省字典)   

复制代码

 1 d = {}
 2 for i in 'abcde':
 3     for j in range(3):
 4         if i not in d.keys():
 5             d[i] = []
 6         d[i].append(j)
 7 print(d)
 8 # ---------------------------->
 9 
10 from collections import defaultdict
11 
12 d = defaultdict(list) # 构造出自己想要的类型
13 for i in 'abcde':
14     for j in range(3):
15         d[i].append(j)
16 print(d) # defaultdict(<class 'list'>, {'a': [0, 1, 2], 'b': [0, 1, 2], 'c': [0, 1, 2], 'd': [0, 1, 2], 'e': [0, 1, 2]})
17 
18 
19 for i in 'abcde':
20     d[i]  = i
21 print(d) # defaultdict(<class 'list'>, {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'})

复制代码

 

10、OrderedDict 有序字典

复制代码

 1 from collections import OrderedDict
 2 
 3 d = OrderedDict()
 4 d[1] = 1
 5 d['2'] = 2
 6 d['c'] = 'c'
 7 d [21] = 's'
 8 d # OrderedDict([(1, 1), ('2', 2), ('c', 'c'), (21, 's')])
 9 # 按照录入的顺序 会记录下来,即便后面再怎么打乱顺序,都不变
10 
11 from collections import OrderedDict
12 import random
13 
14 d = {'a':1,'c':'c',1:'d',10:'d'}
15 
16 keys = list(d)
17 random.shuffle(keys)
18 print(keys)
19 
20 od = OrderedDict()
21 
22 for key in keys:
23     od[key] = d[key]
24 print(od)
25 print(od.keys())
26 
27 结果:(每执行一次,keys顺序改变,但是最后的有序字典都不变)
28 # [1, 'a', 'c', 10]
29 # OrderedDict([(1, 'd'), ('a', 1), ('c', 'c'), (10, 'd')])
30 # odict_keys([1, 'a', 'c', 10])

复制代码

 

    OrderedDict:作用:

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

        3.6 版本的Python 的字典就是记录key插入的顺序(IPython不一定有效)  

    应用场景:

        假如使用字典记录了N 个产品,这些产品使用ID 由小到大加入字典中

        除了使用字典检索的遍历,有时候需要取出ID ,但是希望按照输入的顺序,因为输入顺序是有序的。

 

为什么要坚持,想一想当初!

分类: Python基础知识