美文网首页Python全栈工程师
12.3-字典遍历和删除注意事项

12.3-字典遍历和删除注意事项

作者: BeautifulSoulpy | 来源:发表于2019-08-29 18:13 被阅读0次

梦想最大的意义,并不在于,你最终是否去实现了它。而是它赐予你信心,带给你希望,给予你力量。不是现实支撑了你的梦想,而是你的梦想支撑了现实。


图片.png

用好字典的关键在于Key(set)
字典不会用,基本就不会编程,字典非常重要;

可变类型与不可变类型

可变类型:值可以改变:
列表list
字典dict
不可变类型:值不可以改变:
数值类型int, long, bool, float
字符串str
元组tuple

字典

总结:

  1. Python3中,字典keys\values\items 方法返回一个类似一个生成器的可迭代对象;不会把函数的返回结果复制到内存中;不会产生内存copy,节省内存空间;
    d={}
    type(d.items()) # dict_items([])
  2. Python2中,上面的方法返回一个新的列表,占据新的内存空间,所以Python2建议使用iterkeys、

3.用好字典的关键在于Key

1.字典中的元素访问--三种方式
字典的key

1.key的要求和set的元素要求一致;
2.set的元素可以看做key,set可以看做dict的简化版;
3.hashable 可哈希才可以作为key, 可以使用hash() 测试;

  • d[key]
    key不存在返回KeyError ;
  • get(key[,default])
    key不存在返回缺省值,没有设置返回缺省值;
  • setdefault(key[,default])
    key不存在,添加KV对,value为default,没有设置返回缺省值;
2.访问字典

# 返回一个键的列表
dict1.keys()  
['name','age']

# 返回一个值的列表
dict1.values()  
['linda',13]

# 返回一个包含(键,值)元组的列表
dict1.items() 
[('name','linda'),('age':13)]

# 返回键name对应的值
dict1['name'] 
'linda'

# 得到键的值,若键不存在,则返回默认值
dict1.get('name',None) 
'linda'


# 字典中没有sex,返回默认值man
dict1.get('sex','man') 
'man'

dict.iter()  #方法 iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表。
2.字典的删除;
  • pop(key[key,default])**
    key 存在,移除它,返回它的value;
    key不存在返回default ;
    default未设置,Key不存在则抛出KeyError异常;
  • popitem() 随机删除,没有任何文档表示它的删除有规律
    返回要移除的 一个任意的键值对;
    字典为empty,抛出KeyError 异常;
  • clear()
    清空字典
2.1 字典循环移除元素——移除字典中值为字符串的一项

2.1 字典元素的删除操作——del、pop

2.2 循环内增加、删除value时不允许的;pop会在循环内报错;但单独增删key ;

正确的做法:字典元素的删除——删除key;
keys = []

#直接增删是不允许的,因为 dict 长度是不允许改变的;
for k in d2.keys():
    if k % 2:
        keys.append(k)
       
正确的做法:字典元素的删除——删除key; 
for k in keys:
    d2.pop(k)

---------------------------------------
for k in d.keys():
    print(k)
    if isinstance(d[k],str):
        lst.append(k)
d.pop(lst[0])
d
总结:
1.循环内增加、删除value时不允许的;pop会在循环内报错;
2. del a['c'] 看着像删除了一个对象,本质上是减少了一个对象的引用,del 实际上删除的是名称,而不是对象;


3.字典的遍历\访问;

使用for key, value in dict.items()可以遍历整个字典。如果你只喜欢遍历键名或值,你可以只使用for key in dict.keys()或 for value in dict.values()。

# 1. 遍历 keys-value 
for key, value in d1.items():
    print("{}->{}".format(key, value))
for key, _ in d1.items():   #丢弃一项;
    print(key)

# 2. 遍历key
for key in d1.keys():
    print(key,type(key))     # str  / int  
for k in d:
  print(d[k])

# 3. 遍历value
for value in d1.values():
    print(value)

# 4. 遍历item,即kv对;
for item in d.items():
  print(item)
  print(item[0],item[1])

5. 通用写法:一般不会出现异常;
for k in d:    #  遍历输出的是字典的keys  ;
  print(d[k])


3.2 对字典的遍历默认遍历的是 key ;

1.对字典的遍历都是遍历的 key ;
# 形式1
d = {1: 2000, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 'b': 3000}
for i in d:
    print(i)
----------------------------
1
2
3
4
5
6
7
8
9
b

# 形式2
for k in d.keys():
set(d)
list(d)   、list(d.keys())

for k in d:     # 增加元素; dictionary changed size during iteration;
    d['a00']=100 

values 表示:   d.get[k]
4.字典的内置方法
序号 函数及描述
1 len(dict) 计算字典元素个数,即键的总数。
2 str(dict) 输出字典可打印的字符串表示。
3 type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。
5.缺省字典 collections.defaultdict([default_factory[,...]])

第一个参数时default_factory,缺省为None,它提供一个初始化的函数,当key不存在的时候,这个工厂函数来生成key对应的value

方法1:
import random
from collections import defaultdict

d=defaultdict(list)
for c in 'abcde':
    for i in range(random.randint(1,5)):
        if d[c] not in d:
            d[c]=[]
        d[c].append(i)
print(d)

方法2,3:
import random

d={}
for c in 'abcde':
    for i in range(random.randint(1,5)):
        if not d.get(c):     #  if c not in d.keys():
            d[c]=[]
        d[c].append(i)
print(d)
总结:
1.
import random
from collections import defaultdict

d=defaultdict(list)   
#等价于 d[c]=[]
if d[c] not in d:
    d[c]=[]

总结
1.缺省字典中很多源码都在用;
2.字典为空dict 时,append会报错;缺省字典相当于添加一个空list ;
5.有序字典 OrderedDict (3.6.3版本才出现的;Ipython不会显示;原生Python才行)

记录Key插入的顺序;

# 有序字典的创建;
from collections import OrderedDict
d1 = OrderedDict()

d = {}
d['Tom']='A'
d['Jack']='B'
d['Leo']='C'
d['Alex']='D'
print('无序字典(dict):')
for k,v in d.items():
    print(k,v)

d1 = OrderedDict()   # 保证写入顺序
d1['Tom']='A'
d1['Jack']='B'
d1['Leo']='C'
d1['Alex']='D'
print('\n有序字典(OrderedDict):')
for k,v in d1.items():
    print(k,v)
---------------------------------
无序字典(dict):
Leo C
Jack B
Tom A
Alex D

有序字典(OrderedDict):
Tom A
Jack B
Leo C
Alex D

相关文章

  • 12.3-字典遍历和删除注意事项

    梦想最大的意义,并不在于,你最终是否去实现了它。而是它赐予你信心,带给你希望,给予你力量。不是现实支撑了你的梦想,...

  • 8.字典dict

    目录0.字典介绍1.字典定义和初始化2.字典元素访问3.字典添加和修改4.字典删除5.字典遍历6.字典遍历和移除7...

  • Swift基础语法-字典--对比OC

    1. 定义字典 2. 字典操作 获取 修改 添加 删除 遍历字典

  • Swift 02 字典

    字典 创建字典和创建数组一样创建同时就要制定key和value值的类型 字典的修改和增加 字典的删除 字典的遍历

  • python常见问题集合

    两个列表合并成字典 元组遍历 排序问题 删除字典key

  • python中的dict

    字典的添加、删除、修改操作 字典的遍历 字典items()的使用 每个元素是一个key和value组成的元组,以列...

  • python中dict详解

    字典的添加、删除、修改操作### 字典的遍历### 字典的更新#### 设置默认值### 按照key排序### 按...

  • 一次性移除掉NSUserDefaults中所有的数据

    // 先将其转化为字典,然后用forin遍历删除即可

  • Swift 4.0 字典(Dictionary)学习

    定义字典常量(常量只有读操作) 定义字典变量 赋值 取值 修改value/添加元素 删除元素 字典遍历

  • 新2019计划:python学习-字典【4】

    字典 本篇章讲述数据结构字典,主要围绕如何访问字典,如何修改字典,如何删除字典某元素,如何遍历字典,字典的常见方法...

网友评论

    本文标题:12.3-字典遍历和删除注意事项

    本文链接:https://www.haomeiwen.com/subject/jllwectx.html