Python学习记录6-list、tuple、dict、set复习
数据类型在一门语言中是非常重要的,所以选择再次学习一下加深记忆。本次主要参考了大神廖雪峰的官方网站,非常感谢大神,讲的很清晰,收获很大。
标准数据类型
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元祖)
- Set(集合)
- Dictionary(字典)
按是否可变分类
- 不可变数据(3个)
- Number(数字)
- String(字符串)
- Tuple(元祖)
- 可变数据(3个)
- List(列表)
- Dictionary(字典)
- Set(集合)
List(列表)
- Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
>>> friends = ['小明','小红','小王'] #创建一个list集合
>>> print(friends) #打印
>>> print(type(friends)) #friends变量的类型是list
>>> print(len(friends)) #使用len()函数可以获得list元素的个数
['小明', '小红', '小王']
<class 'list'>
3
#空的list,长度为0
>>> L = []
>>> print(len(L))
0
- 可以用索引访问list中的每一个位置的元素,从0开始
>>> print(friends[0])
小明
>>> print(friends[1])
小红
>>> print(friends[2])
小王
>>> print(friends[3]) #当索引超出范围时,会报IndexError错误
IndexError: list index out of range
#还可以使用负数做索引,-1表示最后一个元素,以此类推
>>> print(friends[-1])
小王
>>> print(friends[-2])
小红
>>> print(friends[-3])
小明
- list是一个可变的有序列表,可以向list中追加元素
1.追加到末尾
>>> friends.append('小张')
>>> print(friends)
['小明', '小红', '小王', '小张']
2.插入到指定位置
>>> friends.insert(1,'小李')
>>> print(friends)
['小明', '小李', '小红', '小王', '小张']
3.删除末尾元素
>>> friends.pop() #删除末尾的元素并返回 这个类似于栈结构的出栈操作
小张
>>> print(friends)
['小明', '小李', '小红', '小王']
4.删除指定位置的元素,使用pop(i),i是索引的位置
>>> friends.pop(2)
小红
>>> print(friends)
['小明', '小李', '小王']
5.替换元素,只需要直接给对应索引位置赋值
>>> friends[0] = '我是替换后的值'
>>> print(friends)
['我是替换后的值', '小李', '小王']
- list中的元素的数据类型可以是不同的
>>> L = [1,'HaHa',False]
- list中存放另一个list
>>> L1 = ['哈哈哈','嘻嘻嘻',['啦啦','咚咚'],'要不起']
>>> print(len(L1)) #长度还是4 因为L1中还是4个元素 只不过其中一个元素是List
>>> print(type(L1))
4
<class 'list'>
#或者拆开写
>>> L2 = ['啦啦','咚咚']
>>> L3 = ['哈哈哈','嘻嘻嘻',L2,'要不起']
>>> print(L3)
['哈哈哈', '嘻嘻嘻', ['啦啦', '咚咚'], '要不起']
#list中存放另一个list时的取值,类似多维数组
>>> print(L3[2][0]) #取L2中的第一个元素的值
啦啦
Tuple(元祖)
- 首先tuple是一个有序但不可变列表,一旦初始化就不能修改,因此没有append(),insert()这种修改操作的方法,因此相对list较安全
#tuple的创建用的是()
>>> friends = ('小明','小红','小王')
>>> print(len(friends))
>>> print(type(friends))
3
<class 'tuple'>
#以逗号隔开,小括号可以省略
>>> friends = '小明','小红','小王'
>>> print(type(friends))
<class 'tuple'>
#空tuple
>>> friends = ()
>>> print(friends)
>>> print(len(friends))
()
0
#取值还是跟list一样的,索引取值 切片取值也可以,跟list一样
>>> print(friends[0]) #小明
>>> print(friends[1]) #小红
>>> print(friends[2]) #小王
>>> print(friends[-1]) #小王
>>> print(friends[-2]) #小红
>>> print(friends[-3]) #小明
#测试是否可变
>>> friends = ('小明','小红','小王')
>>> friends[0] = '小李' #尝试将friends元祖的第一个元素变成'小李'
#直接报错 tuple元祖是不支持写的,是只读的,由此可见tuple确实是一个不可变列表
TypeError: 'tuple' object does not support item assignment
- 创建tuple时需注意的地方
#定义一个只有一个元素的tuple时,需要加上一个逗号,当然是英文的。
#如果不加
>>> t = (1)
>>> print(type(t))
<class 'int'> #可以看到这么定义python会当成数字处理 因为小括号既可以表示tuple类型,又可以表示数学中的小括号,此时会按数学中小括号计算,所以还是数字1
#所以,当只有1个元素的tuple定义时候必须加上一个逗号,
>>> t = (1,)
>>> print(type(t))
>>> print(t)
<class 'tuple'> #此时可以看到类型就是tuple了
(1,) #当然,显示的时候也会加上一个逗号,表示这是一个只有一个元素的tuple
- tuple中放入可变列表list
>>> t1 = ['aa','bb'] #首先创建一个list集合
>>> t2 = ('a','b',t1) #将t1放入t2这个元祖中,此时t2 = ['a','b','aa','bb']
>>> t2[2][0] = 'AA' #改变t1中t2的元素的值
>>> t2[2][1] = 'BB' #改变t1中t2的元素的值
>>> print(t2)
['a','b','AA','BB'] #打印输出后发现里面的值确实改变了,这是否违反了tuple是不可变的呢
#虽然元祖t1中的list集合t2中的元素发生了改变,但实际上元祖t1中的指向的t2对象是没有改变的,
#改变的list中元素的指向,因为list是可变的。因此要创建一个内容也不可变的tuple,就必须保证
#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)存储,查找速度极快,但内存消耗量大。
#定义一个Dict 使用大括号{}
>>> d = {'Mick':96,'Jack':97,'Lucy':98}
#输出
>>> d['Mick']
96
#dict是以hash的方式存储数据,其复杂度为O(1),查找速度极快,是因为在存放时,就根据key算出了value的存放位置,这样取得时候就能根据key直接拿到value,显然这样做会加大内存的消耗,也是典型的空间换时间的做法。
#dict也是一个值对应一个value,因此key是不允许重复的,如果多次对一个key放入value,后面将覆盖前面的
>>> d['Mick'] = 100
>>> print(d['Mick'])
100
>>> d['Mick'] = 200
>>> print(d['Mick'])
200
#上面这些都很好理解,跟java的map很相似。
#判断一个dict中是否存在某个key,使用in,返回Ture或False
>>> print('Mick' in d)
True
#也可以使用dict提供的get(),如果key不存在,返回None或自己指定返回值
>>> d.get('HHH') #不存在key返回None
None
>>> d.get('HHH','不存在') #不存在key并且自己指定返回值
None 不存在
#dict删除元素 使用pop(key)
>>> d.pop('Mick') #返回弹出的值:100
100
>>> print(d)
{'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是可变的就不行。
#尝试一下list作dict的key值
>>> a = [1,2,3]
>>> d={a:'a'}
>>> print(d)
TypeError: unhashable type: 'list' #可以看到报错 不可取hash值的类型
字典类型的常见方法
D.clear() #移除D中的所有项
D.copy() #返回D的副本
D.fromkeys(seq[,val]) #返回从seq中获得的键和被设置为val的值的字典。可做类方法调用
D.get(key[,default]) #如果D[key]存在,将其返回;否则返回给定的默认值None
D.has_key(key) #检查D是否有给定键key
D.items() #返回表示D项的(键,值)对列表
D.iteritems() #从D.items()返回的(键,值)对中返回一个可迭代的对象
D.iterkeys() #从D的键中返回一个可迭代对象
D.itervalues() #从D的值中返回一个可迭代对象
D.keys() #返回D键的列表
D.pop(key[,d]) #移除并且返回对应给定键key或给定的默认值D的值
D.popitem() #从D中移除任意一项,并将其作为(键,值)对返回
D.setdefault(key[,default]) #如果D[key]存在则将其返回;否则返回默认值None
D.update(other) #将other中的每一项加入到D中。
D.values() #返回D中值的列表
Set(集合)
- set是一个无序的不重复元素序列,set和dict类似,但是值存key不存储value,并且由于key不能重复,所以set中的key是不会重复的,可以用来去重
#创建空集合 不能用{}来创建空的set集合 用{}创建的是dict类型 空的set需要用set()来创建
>>> s1 = set() #这种方式创建的是一个空set
>>> print(type(s1))
<class 'set'>
>>> s2 = set{} #这种方式不存在
>>> s2 = {} #这样创建的是空dict
>>> print(type(s2))
<class 'dict'>
#用可迭代对象创建一个新的集合对角
>>> s = set([1,2,3,4]) #放入一个list创建一个set
>>> print(type(s))
>>> print(s)
<class 'set'>
{1, 2, 3, 4}
#放入一个Str类型
>>> s = set('abcdefg')
>>> print(type(s))
>>> print(s)
<class 'set'>
{'a', 'g', 'f', 'd', 'b', 'c', 'e'} #set集合是无序的 这里也可以看出这个顺序没有按照abcdefg我们定义的顺序排序
#通过set(value)创建的set集合,value必须是可迭代的
#假如放入不可迭代的对象
>>> s = set(1) #放入int类型后报错 int类型是不可迭代的
TypeError: 'int' object is not iterable
#重复元素在set中自动去重
>>> s= set([1,1,2,2,3])
>>> print(s)
{1, 2, 3}
#添加元素到set中,使用add(key)方法,重复添加无效
>>> s = set([1,2,3,4])
>>> print(s)
{1,2,3,4}
>>> s.add(1)
>>> s.add(2)
>>> s.add(3)
>>> s.add(4)
>>> print(s)
{1,2,3,4}
#删除set中的元素,使用remove(key)方法
>>> s = set([1,2,3,4])
>>> s.remove(1)
>>> print(s)
{2, 3, 4}
- 数学运算
set可以当成数学上的无序无重复元素的结合来用,可以进行交集、并集、差集、反交集、子集和超集等操作。
#1.交集
>>> set1 = {1,2,3,4,5}
>>> set2 = {4,5,6,7,8}
>>> print(set1 & set2)
>>> print(set1.intersection(set2))
{4, 5}
{4, 5}
#2.并集
>>> set1 = {1,2,3,4,5}
>>> set2 = {4,5,6,7,8}
>>> print(set1 | set2)
>>> print(set2.union(set1))
{1, 2, 3, 4, 5, 6, 7,8}
{1, 2, 3, 4, 5, 6, 7,8}
3.子集和超集
>>> set1 = {1,2,3}
>>> set2 = {1,2,3,4,5,6}
>>> print(set1 < set2)
>>> print(set1.issubset(set2)) #这两个相同,都是说明set1是set2子集。
True
True
>>> print(set2 > set1
>>> print(set2.issuperset(set1)) #这两个相同,都是说明set2是set1超集。
True
True
- frozenset不可变集合
#frozenset是不可变的,对一个frozenset就不能再使用add和remove方法
>>> s = frozenset('James')
>>> print(s)
>>> print(type(s))
frozenset({'e', 's', 'J', 'a', 'm'})
<class 'frozenset'>
#尝试修改frozenset集合,会直接报错
>>> s.add('a')
'frozenset' object has no attribute 'add'
>>> s.remove('J')
'frozenset' object has no attribute 'remove'
本次主要是对list、tuple、dict和set四种类型数据进行了复习和总结,当然还有其他的包括他们的各种方法以及应用场景没有总结到,后面学习中遇到了会再次总结。上面的例子也是参考了很多博客的大神,但是每一个例子都是我自己手动尝试并总结的,一天下来收获很大,我会继续努力。
Python学习记录6-list、tuple、dict、set复习的更多相关文章
- python学习中,list/tuple/dict格式化遇到的问题
昨天上了python培训的第一课,学习了基础知识.包括类型和赋值,函数type(),dir(),id(),help()的使用,list/tuple/dict的定义以及内置函数的操作,函数的定义,控制语 ...
- Python学习记录day5
title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...
- Python学习记录day6
title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...
- Python学习记录day8
目录 Python学习记录day8 1. 静态方法 2. 类方法 3. 属性方法 4. 类的特殊成员方法 4.1 __doc__表示类的描述信息 4.2 __module__ 和 __class__ ...
- Python学习记录day7
目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...
- Python学习记录:括号配对检测问题
Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...
- 实验楼Python学习记录_挑战字符串操作
自我学习记录 Python3 挑战实验 -- 字符串操作 目标 在/home/shiyanlou/Code创建一个 名为 FindDigits.py 的Python 脚本,请读取一串字符串并且把其中所 ...
- Python(一)list tuple dict set
这篇文章是为了复习之前学的python的数据结构: 原文链接:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a ...
- Python 学习之list和Tuple类型
1.创建list L = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59] print(L) print(L[1],L[3],L[5])#索引 不能越界 正向访问 #95. ...
随机推荐
- iOS-上传头像的使用
static NSString *const uploadSuccess = @"更改头像成功"; @interface DMAccountInformationViewContr ...
- EasyUI datagrid列隐藏与显示
隐藏DataGrid某一列 $("#datagrid_view").datagrid('hideColumn', filed); 2. 显示DataGrid隐藏的某一列 $(&qu ...
- C#中设置自定义控件工具箱图标
在设计自定义控件时,系统默认生成的图标比较单一难看,如何为控件设计自己的图标呢,这里给出了一种基于ToolBoxBitmap 属性设置自定义控件工具箱图标的方法. 1)首先将图标文件名改为自定义控件名 ...
- Tracking of Features and Edges
目录 Joint Tracking of Features and Edges Joint Tracking of Features and Edges 1. LK光流 基本LK光流运动假设: \[ ...
- Flutter中的基础组件之一
一.Text文本组件(单一格式的文本) 是具有单一风格的文本字符串,可以跨多行显示,也可全部显示在同一行中,具体显示样子,取决于布局约束. 常用属性: 1.overflow : TextOverflo ...
- 基于LSTM + keras 的诗歌生成器
最近在github 上发现了一个好玩的项目,一个基于LSTM + keras 实现的诗歌生成器,地址是:https://github.com/youyuge34/Poems_generator ...
- 【编程开发】加密算法(MD5,RSA,DES)的解析
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来. MD5将 ...
- 【VS开发】malloc申请内存错误分析
每个进程会有4G的虚拟地址空间, malloc得到的的地址都是虚拟地址, 并且当malloc的时候, 操作系统并不会将实际的内存分配给进程的, 所以malloc只会占用进程自身的虚拟地址空间.我以前也 ...
- list集合的一些小见解
关于LIst集合 前言: 第一次写博客,有些东西可能总结的到位,发表一下自己的一些观点,欢迎大佬们点评和指教 正文: list集合可以分为ArrayLlst和LinkedList. ArrayList ...
- Linux上,最常用的一批命令解析(10年精选)
Linux这么多命令,通常会让初学者望而生畏.下面是我结合日常工作,以及在公司的内部培训中,针对对Linux不是很熟悉的同学,精选的一批必须要搞懂的命令集合.任何一个命令其实都是可以深入的,比如tai ...