第三章 - Python 内置数据结构

字典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']))
    • **kwarg是表示在二元结构后面还是可以加k-v参数来初始化
      d2 = dict(d, c=3)
  • 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中的静态方法)
  d1 = dict.fromkeys(range(1, 11), [1, 2])
  这样产生的字典中所有的value都是列表[1,2]的引用,如果append这个列表,所有的value都会被修改。

字典元素的访问

  • d[key]

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

字典增加和修改

  • 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})

字典删除

  • pop(key[, default])

    • key存在,移除它,并返回它的value
    • key不存在,返回给定的default
    • default未设置,key不存在则抛出KeyError异常
  • popitem()
    • 移除并返回一个任意的键值对
    • 字典为empty,抛出KeyError异常
  • clear()
    • 清空字典

字典删除

  • del语句
    a = True
    b = [6]
    d = {'a': 1, 'b': b, 'c': [1,3,5]}
    del a
    del d['c'] # 删除了一个对象[1,3,5]?
    del b[0]
    c = b
    del c
    del b
    b = d['b']
    p del a['c'] # 看着像删除了一个对象,本质上减少了一个对象的引用,del 实际上删除的是名称,而不是对象

字典遍历

  • for ... in dict

    • 遍历key

   for k in d:
    print(k)

   for k in d.keys():
    print(k)

字典遍历

  • for ... in dict

    • 遍历value

   for k in d:
    print(d[k])

   for k in d.keys():
    print(d.get(k))

   for v in d.values():
    print(v)

字典遍历

  • for ... in dict

    • 遍历item,即k-v对

   for item in d.items():
    print(item)

   for item in d.items():
    print(item[0], item[1])

   for k,v in d.items():
    print(k, v)

   for k, _ in d.items():
    print(k)

   for _ ,v in d.items():
    print(v)

字典遍历

  • 总结

    • Python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中 (可以把返回的 dict_items()、dict_keys()、dict_values() 想象成是帮你到字典中取数据)

      • 是 Dictionary view 对象
      • 字典的entry的动态的视图,字典变化,视图将反映出这些变化
    • Python2中,上面的方法会返回一个新的列表,占据新的内存空间。所以Python2建议使用iterkeys、itervalues、iteritems版本,返回一个迭代器,而不是一个copy

字典遍历和移除

  • 如何在遍历的时候移除元素

   错误的做法:
   d = dict(a=1, b=2, c='abc')
   for k,v in d.items():
     d.pop(k) # RuntimeError: dictionary changed size during iteration
   用字典视图的对象迭代时,是不能修改字典的大小的
   另外在用for 迭代时,字典的大小是不允许改变的,即不允许增删元素。

   while len(d): # 相当于清空,不如直接clear()
     print(d.popitem())

   正确的做法:
   d = dict(a=1, b=2, c='abc')
   keys = []
   for k,v in d.items():
     if isinstance(v, str):
       keys.append(k)
   for k in keys:
     d.pop(k)
   print(d)

字典的key

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

    • set的元素可以就是看做key,set可以看做dict的简化版
    • hashable 可哈希才可以作为key,可以使用hash()测试,即key不可变的,key变了,通过哈希函数找到的值也就变了。
    • d = {1 : 0, 2.0 : 3, "abc" : None, ('hello', 'world', 'python') : "string", b'abc' : '135'}

defaultdict

  • collections.defaultdict([default_factory[, ...]])

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

  import 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)

  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)

  print(d1)

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

OrderedDict

  • 有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
  • 3.6版本的Python的字典就是记录key插入的顺序(IPython不一定有效果)

  • 应用场景:
    • 假如使用字典记录了N个产品,这些产品使用ID由小到大加入到字典中
    • 除了使用字典检索的遍历,有时候需要取出ID,但是希望是按照输入的顺序,因为输入顺序是有序的
    • 否则还需要重新把遍历到的值排序

字典练习

  • 用户输入一个数字

    • 打印每一位数字及其重复的次数
  • 数字重复统计
    • 随机产生100个整数
    • 数字的范围[-1000, 1000]
    • 升序输出所有不同的数字及其重复的次数
  • 字符串重复统计
    • 字符表'abcdefghijklmnopqrstuvwxyz'
    • 随机挑选2个字母组成字符串,共挑选100个
    • 降序输出所有不同的字符串及重复的次数

最后

本文的另外链接是:https://herodanny.github.io/python-magedu-2018-notes12.html

Python全栈-magedu-2018-笔记12的更多相关文章

  1. 自学Python全栈开发第一次笔记

           我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...

  2. Python全栈之jQuery笔记

    jQuery runnoob网址: http://www.runoob.com/jquery/jquery-tutorial.html jQuery API手册: http://www.runoob. ...

  3. python全栈开发之OS模块的总结

    OS模块 1. os.name()      获取当前的系统 2.os.getcwd      #获取当前的工作目录 import os cwd=os.getcwd() # dir=os.listdi ...

  4. python全栈开发中级班全程笔记(第二模块、第四章(三、re 正则表达式))

    python全栈开发笔记第二模块   第四章 :常用模块(第三部分) 一.正则表达式的作用与方法 正则表达式是什么呢?一个问题带来正则表达式的重要性和作用      有一个需求 : 从文件中读取所有联 ...

  5. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  6. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  7. python全栈开发中级班全程笔记(第二模块、第三章)(员工信息增删改查作业讲解)

    python全栈开发中级班全程笔记 第三章:员工信息增删改查作业代码 作业要求: 员工增删改查表用代码实现一个简单的员工信息增删改查表需求: 1.支持模糊查询,(1.find name ,age fo ...

  8. 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂

    Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...

  9. 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师

    为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...

  10. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

随机推荐

  1. 2015年2月编程语言排行榜:JavaScript排名达到历史最高

    JavaScript在赢得2014年最后一个月的TIOBE编程语言奖后,并且还在不断走强.在二月份JavaScript就超过了PHP,并 且达到它有史以来最高的位置,排行到TOP 6.另一方面,Obj ...

  2. Nginx概述、安装及配置详解

    nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...

  3. oracle sql 数结构表id降序

    UPDATE BAS_ORGANIZATION_TYPE T1SET T1.PARENTID=(select rn from (SELECT id,rownum rn FROM BAS_ORGANIZ ...

  4. HBase中的TTL与MinVersion的关系

    HBase版本:1.3.1 TTL(Time-To-Live):每个Cell的数据超时时间(当前时间 - 最后更新的时间) MinVersion:如果当前存储的所有时间版本都早于TTL,至少MIN_V ...

  5. 3.1.2 condition 条件

    package 第三章.重入锁; import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Reent ...

  6. QtCreator下QML翻译

    首先打开.pro工程文件,在文件中添加文本段:TRANSLATIONS = testTranslate_zh.ts 在pro右键,单击再次弹出命令提示,如图 在命令行中,输入lupdate testT ...

  7. C# 进程Process基本的操作说明

    public int CallPhoneExe(string arg) //arg为进程的命令行参数 { WaitHandle[] waits =new WaitHandle[2]; //定义两个Wa ...

  8. jquery 常用工具方法

    inArray(value, array [, fromIndex ])方法类似于原生javascript的indexOf()方法,没有找到匹配元素时它返回-1.如果数组第一个元素匹配参数,那么$.i ...

  9. 使用virtualBox安装CentOS 6.3的详细步骤

    由于前几天把系统升级到win7了,原先安装的Linux虚拟机都不存在了.基于学习,这次安装选择的是CentOS 6.3版本. 下面就看看具体的安装步骤: 名称可以随便填写,类型选择Linux,版本选择 ...

  10. centos7 编译安装nginx

    转载文章 原文地址 https://www.cnblogs.com/liujuncm5/p/6713784.html 安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可 ...