数据类型在一门语言中是非常重要的,所以选择再次学习一下加深记忆。本次主要参考了大神廖雪峰的官方网站,非常感谢大神,讲的很清晰,收获很大。

标准数据类型

  • Number(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元祖)
  • Set(集合)
  • Dictionary(字典)

按是否可变分类

  • 不可变数据(3个)

    • Number(数字)
    • String(字符串)
    • Tuple(元祖)
  • 可变数据(3个)
    • List(列表)
    • Dictionary(字典)
    • Set(集合)

List(列表)

  • Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。

  1. >>> friends = ['小明','小红','小王'] #创建一个list集合
  2. >>> print(friends) #打印
  3. >>> print(type(friends)) #friends变量的类型是list
  4. >>> print(len(friends)) #使用len()函数可以获得list元素的个数
  5. ['小明', '小红', '小王']
  6. <class 'list'>
  7. 3
  8. #空的list,长度为0
  9. >>> L = []
  10. >>> print(len(L))
  11. 0
  • 可以用索引访问list中的每一个位置的元素,从0开始

  1. >>> print(friends[0])
  2. 小明
  3. >>> print(friends[1])
  4. 小红
  5. >>> print(friends[2])
  6. 小王
  7. >>> print(friends[3]) #当索引超出范围时,会报IndexError错误
  8. IndexError: list index out of range
  9. #还可以使用负数做索引,-1表示最后一个元素,以此类推
  10. >>> print(friends[-1])
  11. 小王
  12. >>> print(friends[-2])
  13. 小红
  14. >>> print(friends[-3])
  15. 小明
  • list是一个可变的有序列表,可以向list中追加元素

  1. 1.追加到末尾
  2. >>> friends.append('小张')
  3. >>> print(friends)
  4. ['小明', '小红', '小王', '小张']
  5. 2.插入到指定位置
  6. >>> friends.insert(1,'小李')
  7. >>> print(friends)
  8. ['小明', '小李', '小红', '小王', '小张']
  9. 3.删除末尾元素
  10. >>> friends.pop() #删除末尾的元素并返回 这个类似于栈结构的出栈操作
  11. 小张
  12. >>> print(friends)
  13. ['小明', '小李', '小红', '小王']
  14. 4.删除指定位置的元素,使用pop(i),i是索引的位置
  15. >>> friends.pop(2)
  16. 小红
  17. >>> print(friends)
  18. ['小明', '小李', '小王']
  19. 5.替换元素,只需要直接给对应索引位置赋值
  20. >>> friends[0] = '我是替换后的值'
  21. >>> print(friends)
  22. ['我是替换后的值', '小李', '小王']
  • list中的元素的数据类型可以是不同的

  1. >>> L = [1,'HaHa',False]
  • list中存放另一个list

  1. >>> L1 = ['哈哈哈','嘻嘻嘻',['啦啦','咚咚'],'要不起']
  2. >>> print(len(L1)) #长度还是4 因为L1中还是4个元素 只不过其中一个元素是List
  3. >>> print(type(L1))
  4. 4
  5. <class 'list'>
  6. #或者拆开写
  7. >>> L2 = ['啦啦','咚咚']
  8. >>> L3 = ['哈哈哈','嘻嘻嘻',L2,'要不起']
  9. >>> print(L3)
  10. ['哈哈哈', '嘻嘻嘻', ['啦啦', '咚咚'], '要不起']
  11. #list中存放另一个list时的取值,类似多维数组
  12. >>> print(L3[2][0]) #取L2中的第一个元素的值
  13. 啦啦

Tuple(元祖)

  • 首先tuple是一个有序但不可变列表,一旦初始化就不能修改,因此没有append(),insert()这种修改操作的方法,因此相对list较安全
  1. #tuple的创建用的是()
  2. >>> friends = ('小明','小红','小王')
  3. >>> print(len(friends))
  4. >>> print(type(friends))
  5. 3
  6. <class 'tuple'>
  7. #以逗号隔开,小括号可以省略
  8. >>> friends = '小明','小红','小王'
  9. >>> print(type(friends))
  10. <class 'tuple'>
  11. #空tuple
  12. >>> friends = ()
  13. >>> print(friends)
  14. >>> print(len(friends))
  15. ()
  16. 0
  17. #取值还是跟list一样的,索引取值 切片取值也可以,跟list一样
  18. >>> print(friends[0]) #小明
  19. >>> print(friends[1]) #小红
  20. >>> print(friends[2]) #小王
  21. >>> print(friends[-1]) #小王
  22. >>> print(friends[-2]) #小红
  23. >>> print(friends[-3]) #小明
  24. #测试是否可变
  25. >>> friends = ('小明','小红','小王')
  26. >>> friends[0] = '小李' #尝试将friends元祖的第一个元素变成'小李'
  27. #直接报错 tuple元祖是不支持写的,是只读的,由此可见tuple确实是一个不可变列表
  28. TypeError: 'tuple' object does not support item assignment
  • 创建tuple时需注意的地方

  1. #定义一个只有一个元素的tuple时,需要加上一个逗号,当然是英文的。
  2. #如果不加
  3. >>> t = (1)
  4. >>> print(type(t))
  5. <class 'int'> #可以看到这么定义python会当成数字处理 因为小括号既可以表示tuple类型,又可以表示数学中的小括号,此时会按数学中小括号计算,所以还是数字1
  6. #所以,当只有1个元素的tuple定义时候必须加上一个逗号,
  7. >>> t = (1,)
  8. >>> print(type(t))
  9. >>> print(t)
  10. <class 'tuple'> #此时可以看到类型就是tuple了
  11. (1,) #当然,显示的时候也会加上一个逗号,表示这是一个只有一个元素的tuple
  • tuple中放入可变列表list
  1. >>> t1 = ['aa','bb'] #首先创建一个list集合
  2. >>> t2 = ('a','b',t1) #将t1放入t2这个元祖中,此时t2 = ['a','b','aa','bb']
  3. >>> t2[2][0] = 'AA' #改变t1中t2的元素的值
  4. >>> t2[2][1] = 'BB' #改变t1中t2的元素的值
  5. >>> print(t2)
  6. ['a','b','AA','BB'] #打印输出后发现里面的值确实改变了,这是否违反了tuple是不可变的呢
  7. #虽然元祖t1中的list集合t2中的元素发生了改变,但实际上元祖t1中的指向的t2对象是没有改变的,
  8. #改变的list中元素的指向,因为list是可变的。因此要创建一个内容也不可变的tuple,就必须保证
  9. #tuple中的每一个元素本身也不能变,比如最开始列举的Number和Str类型。
  • tuple相关的内置函数(与list相仿)

    1.len(tuple):计算元祖元素个数

    2.max(tuple):返回元祖中元素最大值

    3.min(tuple):返回元祖中元素最小值

    4.tuple(seq):将列表转换为元祖

  • tuple的方法

    1.count():返回元素在tuple中出现的次数

    2.index():查找元素第一次出现位置的索引值

  • tuple与list对比

    1.定义方式基本相同,tuple是小括号(可省略),list是方括号

    2.都是有序的,按定义的次序排序,都支持索引、负索引、切片访问

    3.tuple是不可变的,因此不能增、删、改元素(没有例如append、extend、remove、pop等方法)

    4.tuple比list操作速度快,需要频繁遍历时推荐使用tuple代替list。并且只可读,相当于对数据进行了“写保护”,使代码更安全。

    5.tuple和list可以互相转换,并返回一个新的集合。tuple转list后,由不可变转可变;list转tuple后,由可变转不可变。从效果上看,tuple冻结一个list,而list解冻一个tuple(这句话写的很形象)

Dict(字典)

  • dict是python中的字典类型,类似于java中的map,使用键-值(key-value)存储,查找速度极快,但内存消耗量大。

  1. #定义一个Dict 使用大括号{}
  2. >>> d = {'Mick':96,'Jack':97,'Lucy':98}
  3. #输出
  4. >>> d['Mick']
  5. 96
  6. #dict是以hash的方式存储数据,其复杂度为O(1),查找速度极快,是因为在存放时,就根据key算出了value的存放位置,这样取得时候就能根据key直接拿到value,显然这样做会加大内存的消耗,也是典型的空间换时间的做法。
  7. #dict也是一个值对应一个value,因此key是不允许重复的,如果多次对一个key放入value,后面将覆盖前面的
  8. >>> d['Mick'] = 100
  9. >>> print(d['Mick'])
  10. 100
  11. >>> d['Mick'] = 200
  12. >>> print(d['Mick'])
  13. 200
  14. #上面这些都很好理解,跟java的map很相似。
  15. #判断一个dict中是否存在某个key,使用in,返回Ture或False
  16. >>> print('Mick' in d)
  17. True
  18. #也可以使用dict提供的get(),如果key不存在,返回None或自己指定返回值
  19. >>> d.get('HHH') #不存在key返回None
  20. None
  21. >>> d.get('HHH','不存在') #不存在key并且自己指定返回值
  22. None 不存在
  23. #dict删除元素 使用pop(key)
  24. >>> d.pop('Mick') #返回弹出的值:100
  25. 100
  26. >>> print(d)
  27. {'Jack': 97, 'Lucy': 98}
  • dict与list相比

    1.dict查找和插入速度极快,不会因数据量增加而变慢,复杂度为O(1),而list正好相反

    2.dict占用内存大,内存浪费多,list相反

    3.由于dict要根据key来计算value的存储位置,因此每次计算相同的key的结果必须相同的(key的hash值),作为key的对象就不能变,所以dict的key必须为不可变对象,例如Number和Str,而list是可变的就不行。

  1. #尝试一下list作dict的key值
  2. >>> a = [1,2,3]
  3. >>> d={a:'a'}
  4. >>> print(d)
  5. TypeError: unhashable type: 'list' #可以看到报错 不可取hash值的类型
  6. 字典类型的常见方法
  7. D.clear() #移除D中的所有项
  8. D.copy() #返回D的副本
  9. D.fromkeys(seq[,val]) #返回从seq中获得的键和被设置为val的值的字典。可做类方法调用
  10. D.get(key[,default]) #如果D[key]存在,将其返回;否则返回给定的默认值None
  11. D.has_key(key) #检查D是否有给定键key
  12. D.items() #返回表示D项的(键,值)对列表
  13. D.iteritems() #从D.items()返回的(键,值)对中返回一个可迭代的对象
  14. D.iterkeys() #从D的键中返回一个可迭代对象
  15. D.itervalues() #从D的值中返回一个可迭代对象
  16. D.keys() #返回D键的列表
  17. D.pop(key[,d]) #移除并且返回对应给定键key或给定的默认值D的值
  18. D.popitem() #从D中移除任意一项,并将其作为(键,值)对返回
  19. D.setdefault(key[,default]) #如果D[key]存在则将其返回;否则返回默认值None
  20. D.update(other) #将other中的每一项加入到D中。
  21. D.values() #返回D中值的列表

Set(集合)

  • set是一个无序的不重复元素序列,set和dict类似,但是值存key不存储value,并且由于key不能重复,所以set中的key是不会重复的,可以用来去重
  1. #创建空集合 不能用{}来创建空的set集合 用{}创建的是dict类型 空的set需要用set()来创建
  2. >>> s1 = set() #这种方式创建的是一个空set
  3. >>> print(type(s1))
  4. <class 'set'>
  5. >>> s2 = set{} #这种方式不存在
  6. >>> s2 = {} #这样创建的是空dict
  7. >>> print(type(s2))
  8. <class 'dict'>
  9. #用可迭代对象创建一个新的集合对角
  10. >>> s = set([1,2,3,4]) #放入一个list创建一个set
  11. >>> print(type(s))
  12. >>> print(s)
  13. <class 'set'>
  14. {1, 2, 3, 4}
  15. #放入一个Str类型
  16. >>> s = set('abcdefg')
  17. >>> print(type(s))
  18. >>> print(s)
  19. <class 'set'>
  20. {'a', 'g', 'f', 'd', 'b', 'c', 'e'} #set集合是无序的 这里也可以看出这个顺序没有按照abcdefg我们定义的顺序排序
  21. #通过set(value)创建的set集合,value必须是可迭代的
  22. #假如放入不可迭代的对象
  23. >>> s = set(1) #放入int类型后报错 int类型是不可迭代的
  24. TypeError: 'int' object is not iterable
  25. #重复元素在set中自动去重
  26. >>> s= set([1,1,2,2,3])
  27. >>> print(s)
  28. {1, 2, 3}
  29. #添加元素到set中,使用add(key)方法,重复添加无效
  30. >>> s = set([1,2,3,4])
  31. >>> print(s)
  32. {1,2,3,4}
  33. >>> s.add(1)
  34. >>> s.add(2)
  35. >>> s.add(3)
  36. >>> s.add(4)
  37. >>> print(s)
  38. {1,2,3,4}
  39. #删除set中的元素,使用remove(key)方法
  40. >>> s = set([1,2,3,4])
  41. >>> s.remove(1)
  42. >>> print(s)
  43. {2, 3, 4}
  • 数学运算
  1. set可以当成数学上的无序无重复元素的结合来用,可以进行交集、并集、差集、反交集、子集和超集等操作。
  2. #1.交集
  3. >>> set1 = {1,2,3,4,5}
  4. >>> set2 = {4,5,6,7,8}
  5. >>> print(set1 & set2)
  6. >>> print(set1.intersection(set2))
  7. {4, 5}
  8. {4, 5}
  9. #2.并集
  10. >>> set1 = {1,2,3,4,5}
  11. >>> set2 = {4,5,6,7,8}
  12. >>> print(set1 | set2)
  13. >>> print(set2.union(set1))
  14. {1, 2, 3, 4, 5, 6, 7,8}
  15. {1, 2, 3, 4, 5, 6, 7,8}
  16. 3.子集和超集
  17. >>> set1 = {1,2,3}
  18. >>> set2 = {1,2,3,4,5,6}
  19. >>> print(set1 < set2)
  20. >>> print(set1.issubset(set2)) #这两个相同,都是说明set1是set2子集。
  21. True
  22. True
  23. >>> print(set2 > set1
  24. >>> print(set2.issuperset(set1)) #这两个相同,都是说明set2是set1超集。
  25. True
  26. True
  • frozenset不可变集合
  1. #frozenset是不可变的,对一个frozenset就不能再使用add和remove方法
  2. >>> s = frozenset('James')
  3. >>> print(s)
  4. >>> print(type(s))
  5. frozenset({'e', 's', 'J', 'a', 'm'})
  6. <class 'frozenset'>
  7. #尝试修改frozenset集合,会直接报错
  8. >>> s.add('a')
  9. 'frozenset' object has no attribute 'add'
  10. >>> s.remove('J')
  11. 'frozenset' object has no attribute 'remove'

本次主要是对list、tuple、dict和set四种类型数据进行了复习和总结,当然还有其他的包括他们的各种方法以及应用场景没有总结到,后面学习中遇到了会再次总结。上面的例子也是参考了很多博客的大神,但是每一个例子都是我自己手动尝试并总结的,一天下来收获很大,我会继续努力。

Python学习记录6-list、tuple、dict、set复习的更多相关文章

  1. python学习中,list/tuple/dict格式化遇到的问题

    昨天上了python培训的第一课,学习了基础知识.包括类型和赋值,函数type(),dir(),id(),help()的使用,list/tuple/dict的定义以及内置函数的操作,函数的定义,控制语 ...

  2. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  3. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  4. Python学习记录day8

    目录 Python学习记录day8 1. 静态方法 2. 类方法 3. 属性方法 4. 类的特殊成员方法 4.1 __doc__表示类的描述信息 4.2 __module__ 和 __class__ ...

  5. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

  6. Python学习记录:括号配对检测问题

    Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...

  7. 实验楼Python学习记录_挑战字符串操作

    自我学习记录 Python3 挑战实验 -- 字符串操作 目标 在/home/shiyanlou/Code创建一个 名为 FindDigits.py 的Python 脚本,请读取一串字符串并且把其中所 ...

  8. Python(一)list tuple dict set

    这篇文章是为了复习之前学的python的数据结构: 原文链接:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a ...

  9. Python 学习之list和Tuple类型

    1.创建list L = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] print(L) print(L[1],L[3],L[5])#索引 不能越界 正向访问 #95. ...

随机推荐

  1. bs4笔记

    1.网页输出乱码的解决办法 r= requests.get('https://www.baidu.com/') r.encoding = 'gbk2312'   #有可能 gbk.utf-8 soup ...

  2. PAT 甲级 1027 Colors in Mars (20 分)(简单,进制转换)

    1027 Colors in Mars (20 分)   People in Mars represent the colors in their computers in a similar way ...

  3. java 中 this 和 super 说明及在构造器中super()和this()相互调用执行顺序

    this this 表示当前对象 使用上细分的话,this有 this. 和this()的使用情况 ,下面我们开始细撸 this . 使用场景一: 在成员方法中,this.变量名 指带当前对象的变量, ...

  4. 记录编译<Separable Subsurface Scattering demo>工程遇到的问题

    1. Separable Subsurface Scattering demo 可以从 https://github.com/iryoku/separable-sss 下载下来,但是默认的sln 是 ...

  5. PHP根据IP判断地区名信息的示例代码

    <?php header("Content-type: text/html; charset=utf-8"); function getIP(){ if (isset($_S ...

  6. ue-cli3 取消eslint校验代码

    参考链接:https://www.cnblogs.com/sjie/p/9884362.html

  7. 记录下为了玩 docker 安装 CentOS 7 最简化版后遇到的一些问题

    今天我的腾讯云服务器在使用docker安装ElasticSearch和Kibana的时候内存不够,安装完直接卡死.所以无奈只能在本地上跑VMWare安装CentOS7来运行测试. 从阿里云镜像地址:h ...

  8. 《MIT 6.828 Lab 1 Exercise 8》实验报告

    本实验的网站链接:MIT 6.828 Lab 1 Exercise 8. 题目 Exercise 8. Read through kern/printf.c, lib/printfmt.c, and ...

  9. python 1秒启动一个下载服务器

    在Linux系统中,进入要下载文件的目录,用python执行以下命令.启动一个简单的文件下载服务器. python2: [root@saltstack-1 apps]# python -m Simpl ...

  10. Design In-Memory File System

    Design an in-memory file system to simulate the following functions: ls: Given a path in string form ...