列表、元组、字典、集合

列表、元组、字典、集合


1. 列表

  • 序列是Python中最基本的数据结构。序列中的每一个元素都分配一个数字- 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
  • Python有6个序列的内置类型,但最多见的是列表和元组。
  • 序列均可以进行的操做包括索引,切片,加,乘,检查成员。
  • 此外,Python已经内置肯定序列的长度以及肯定最大和最小的元素的方法。
  • 列表是最经常使用的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)

2. 元组

元组也是存一组数据,只是一旦建立,便不能修改,因此又叫只读列表。元组建立很简单,只须要在括号中添加元素,并使用逗号隔开便可。linux

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。安全


3. 字典

3.1 字典的使用

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

d = {key1 : value1, key2 : value2 }

键必须是惟一的,但值则没必要。值能够取任何数据类型,但键必须是不可变的,如字符串,数字或元组。app

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:

3. 集合

集合是一个无序的不重复的数据组合,它的主要做用以下:测试

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

经常使用操做ui

#去重
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))
相关文章
相关标签/搜索