列表、元组、字典、集合

  1. 列表
    序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字- 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
    Python有6个序列的内置类型,但最常见的是列表和元组。
    序列都可以进行的操作包括索引,切片,加,乘,检查成员。
    此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。
    列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。
    列表的数据项不需要具有相同的类型
    创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。
    列表的一般用法:

list1 = ['frui','male',1989,'python',[2016,2017],'c'] #list内元素的数据类型可以不同,也可以是另外一个list
list2 = ['']
print (list1)

使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符,如下所示:

print (list1[:])
print (list1[0],list1[1])
print (list1[-1],list1[-2])
print (list1[0:3]) #切片,此操作顾头不顾尾
print (list1[:3])
print (list1[-3:]) #切片,从后向前数索引,也只能从左往右切片,同样是顾头不顾尾。(这样会无法取到最后一个元素,思考怎么办?)
print (list1[0:-1:2]) #按步长切片
print (list1[::2]) #按步长切片

list1.append("linux") #在列表末尾追加元素
list1.insert(1,"linux") #直接把元素插入的指定位置
list1[0] = "jay" #(改)直接替换某个位置元素

delete

list1.pop() #删除list末尾的元素
list1.pop(1) #删除指定位置的元素
del list1[0]
list1.remove("python") #此种方法和前两种的区别是什么?

print (list1)
print (list1.index(1989)) #查找已知元素的索引
print (list1[list1.index(1989)])

print (list1.count(1989)) #打印某元素在列表中的数量
list1.clear() #清除整个列表
list1.reverse() #反转整个列表
list1.sort() #排序 按ASCII码顺序排序,若元素中有list类型,则无法排序,为什么?

list2 = [1,2,3,4]
list1.extend(list2) #列表合并
print (list1)
del list2 #删除整个变量

列表的深浅copy

浅拷贝只能拷贝最外层,修改内层则原列表和新列表都会变化。

深拷贝是指将原列表完全克隆一份新的。

import copy
list1 = ['frui','male',1989,'python',[2016,2017],'c']
list2 = list1.copy() #浅copy
list3 = copy.copy(list1) #浅copy,同list1.copy()效果相同
list4 = copy.deepcopy(list1) #深copy,会和list1占用同样大小的内存空间
list1[0] = '自由'
list1[4][0] = 2015
print (list1,'\n',list2,'\n',list3,'\n',list4)

列表的循环:逐个打印列表元素

list1 = ['frui','male',1989,'python',[2016,2017],'c']
for i in list1:
print (i)

  1. 元组
    元组也是存一组数据,只是一旦创建,便不能修改,所以又叫只读列表。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

tup1 = (1,2,3,4,5)
tup2 = ('frui', 27)
tup3 = "a", "b", "c", "d";
tup4 = () #创建空元组
元组中只包含一个元素时,需要在元素后面添加逗号

tuple5 = (50,) #元组中只包含一个元素时,需要在元素后面添加逗号
tuple6 = (50)

如果不加逗号,则定义的不是tuple,是50这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算。

元组只有两个方法:count和index
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

  1. 字典
    3.1 字典的使用
    字典是另一种可变容器模型,且可存储任意类型对象。
    字典的每个键值对()用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }
键必须是唯一的,但值则不必。值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

info = {
'stu1':"Xiao Ming",
'stu2':"Xiao Liang",
'stu3':"Xiao Hong",
'stu4':"Xiao Rui",
}
print (info)

修改

info['stu2'] = "Xiao Hu"

增加

info['stu5'] = "Xiao Fang"

删除

info.pop('stu2')
del info['stu1']
info.popitem() #随机删一个
print (info)
info.clear() #清空字典所有条目

查找

print ('stu2' in info) #判断是否存在,存在则返回True,否则返回False
print (info['stu1']) #如果一个key不存在,就报错,get不会,不存在只返回None

dict.get(key, default=None)

返回指定键的值,如果值不在字典中返回default值

比较安全的查找方法

print (info.get('stu6'))

其他

print (info.values()) #打印所有的值(即除了key)
print (info.keys()) #打印所有的key
print (info.items()) #把字典转化为列表

dict.setdefault(key, default=None)

和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default

info.setdefault ('class3',{'Xiao Rui', 15})
print (info)
info.setdefault ('class1',{'Xiao Hong', 16})
print (info)

循环打印

for i in info:
print (i,info[i])

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

多级字典嵌套及操作

info = {
'class1':{
'stu1':["Xiao Ming",16]
},

'class2':{
    'stu2':["Xiao Liang",17]
}

}
info['class1']['stu1'][1] = 18
print (info)

dict.fromkeys(seq[, val]))

创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值

eg:
print (dict.fromkeys([6,7,8],'test'))
c = dict.fromkeys([6,7,8],[1,{'name':'frui'}])
c[6][1]['name'] = 'sorui'
print (c)

update方法

info = {
'stu1':"Xiao Ming",
'stu2':"Xiao Liang",
'stu3':"Xiao Hong",
'stu4':"Xiao Rui",
}
b = {
'stu1': "Xiao Dong",
1:3,
2:4
}
print (info)
info.update(b)
为什么dict查找速度这么快?
因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。dict就是第二种实现方式。
和list比较,dict有以下几个特点:
无序
查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
而list相反:
查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

  1. 集合
    集合是一个无序的,不重复的数据组合,它的主要作用如下:

去重,把一个列表变成集合,就自动去重了
关系测试,测试两组数据之前的交集、差集、并集等关系
常用操作

去重

list1 = [3,2,1,4,5,6,5,4,3,2,1]
print (list1, type(list1))
list1 = set(list1)
print (list1, type(list1))

list2 = set([4,5,6,7,8,9])

交集

print (list1.intersection(list2))

并集

print (list1.union(list2))

差集

print (list1.difference(list2))
print (list2.difference(list1))

子集、父集

print (list1.issubset(list2))
print (list1.issuperset(list2))

list3 = set([4,5,6])
print (list3.issubset(list2))
print (list2.issuperset(list3))

对称差集

print (list1.symmetric_difference(list2))

Return True if two sets have a null intersection

list4 = set([1,2,3])
print (list3.isdisjoint(list4))

交集

print (list1 & list2)

union

print (list2 | list1)

difference

print (list1 - list2)

对称差集

print (list1 ^ list2)

添加

list1.add(999) #添加一项
print (list1)
list1.update([66,77,88]) #添加多项
print (list1)
print (list1.add(999)) #猜猜打印什么?为什么

删除

list1.remove(999)
print (list1)

remove and return arbitrary set element

print (list1.pop())

Remove an element from a set if it is a member.If the element is not a member, do nothing.

print (list1.discard(888))

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容