标签:
一、python有很多内置数据结构,下面从不同角度将它们分类。
1、单值和集合
单值类型的数据结构在内存中是连续存储的,所以一旦生成就无法改变,如果没有被引用了,则被系统回收,如果想改变单值类型的数据结构,python的做法是生成新的数据结构。
a=1 print(id(a)) #2006314800 a=2 print(id(a)) #2006314832 #尝试改变数字a,发现开辟了新的内存空间
集合类型的数据结构是复合而成的,比如
1 a=[1,‘2‘,‘string‘] 2 #由数字和字符串组成的列表 3 b=(1,‘string‘) 4 #由数字和字符串组成的元组 5 6 c=[[‘1‘,‘2‘,‘string‘],‘zhoufeng‘] 7 #由列表和字符串组成的列表 8 9 d={1:(1,‘string‘),2:(2,‘string‘)} 10 #由数字和元组组成的字典
2、按是否有序划分
“有序”是一个很重要的特性,有很多操作围绕“有序”展开,下面列举常见内置数据结构的方法。
二、数据结构方法
补充:方法和函数的区别在于,方法是绑定了类实例(对象)的,因为一个数据结构也是一个对象,所以数据结构拥有方法,具体类的概念后面介绍。
查看一个数据结构有哪些方法:
dir(list) #dir()用于列出一个类或者对象所拥有的方法,"__XXX__"这种是内置方法,不带“__”的是非内置方法,非内置方法只有一种执行方式。
[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__delitem__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__gt__‘, ‘__hash__‘, ‘__iadd__‘, ‘__imul__‘, ‘__init__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__reversed__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__setitem__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘append‘, ‘clear‘, ‘copy‘, ‘count‘, ‘extend‘, ‘index‘, ‘insert‘, ‘pop‘, ‘remove‘, ‘reverse‘, ‘sort‘]
1、数字操作 #数字的很多内置方法都有语法糖
①int() #将别的类型转换成整型 ②isdigit() #判断是否是数字 ③abs() #取绝对值
2、序列通用操作(适用于列表、元组、字符串)
①索引 greeting=‘hello‘ numbers=[1,2,3,4,5,6,7,8,9,10] print(greeting[0]) #索引从0开始 #h print(greeting[-1]) #-1表示倒数第一个,这样比较好记忆 #o ②分片 print(greeting[2:4]) #第1个索引是要提取的第1个元素的编号,第2个索引是分片后剩余部分的第1个元素的编号,简而言之,“顾前不顾后” #11 print(numbers[-3:]) #取倒数3个元素 #[8, 9, 10] print(numbers[:3]) #取前3个元素 #[1, 2, 3] print(numbers[0:10:2]) #设置步长为2,步长可以是负数,表示从右到左提取元素 #[1, 3, 5, 7, 9] ③序列加法 #两种相同类型的序列才能够相加 print(‘hello, ‘+‘world‘) #hello, world print([1,2,3]+[4,5,6]) [1, 2, 3, 4, 5, 6] ④序列乘法 print([1,2]*5) #[1, 2, 1, 2, 1, 2, 1, 2, 1, 2] print(‘hello‘*5) hellohellohellohellohello ⑤成员资格 #存在性检查 print(‘h‘ in ‘hello‘) True print(1 in [1,2,3]) True print(‘zhou‘ in (‘zhou‘,‘feng‘)) True ⑥max、min、len print(max([1,2,3])) #如果是数字序列,则是比较数值大小 print(max([‘zhou‘,‘feng‘,‘de‘])) #如果是字符,则是比较ASCII大小 print(len([‘zhou‘,‘feng‘,‘de‘,‘shu‘])) #返回序列中元素个数 #4 ⑦遍历(迭代) #列表和元组按元素遍历,字符串按字符遍历 lst1=[‘item1‘,‘item2‘,‘item3‘,‘item4‘] for i in lst1: if i == ‘item2‘: print(‘pass‘) continue if i == ‘item3‘: print(‘found!‘) break #pass #found!
3、列表操作
列表实质是一个链表,存储时不要求空间连续,这也是能够修改它的原因。
①list函数 #将任意一个序列(列表、元组、字符串)变成列表 a=list("hello") print(a) #[‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘] ②元素赋值 x=[1,1,1] x[1]=2 print(x) #[1, 2, 1] ③ 删除元素 names=[‘alice‘,‘beth‘,‘cecil‘,‘dee-dee‘] del names[2] print(names) #[‘alice‘, ‘beth‘, ‘dee-dee‘] ④分片赋值 d=[1,2,3,4] d[-2:]=[5,6] print(d) #[1,2,5,6] ⑤append #在末尾追加新的对象,注意是原地修改,没有生成修改后的副本 list1=[1,2] list2=[3,4] list1.append(list2) print(list1) #[1, 2, [3, 4]] ⑥extend #扩展,在列表末尾追加另一个序列的多个值,注意是原地修改,没有生成修改后的副本,这点是和序列加法不同的地方 list3=[1,2] list4=[3,4] list3.extend(list4) print(list3) #[1, 2, 3, 4] ⑦index #通过值取索引,和通过索引取值是相反的过程 list5=[‘we‘,‘are‘,‘winner‘] print(list5.index(‘are‘)) #1 ⑧insert #在指定位置插入元素 list6=[1,2,3,4] list6.insert(2,‘item‘) print(list6) #[1, 2, ‘item‘, 3, 4] ⑨pop #弹出指定下标的元素(从列表中删除一个元素并返回这个元素),如果没有指定下标,默认最后一个 list7=[‘item1‘,‘item2‘,‘item3‘,‘item4‘] print(list7.pop()) #item4 list8=[‘item1‘,‘item2‘,‘item3‘,‘item4‘] print(list8.pop(0)) #item1 ⑩remove #按值删除元素,如果某个值存在多个,则删除第一个匹配项 list9=[‘my‘,‘name‘,‘is‘,‘zhoufeng‘,‘zhoufeng‘,‘is‘,‘me‘] list9.remove(‘zhoufeng‘) print(list9) #[‘my‘, ‘name‘, ‘is‘, ‘zhoufeng‘, ‘is‘, ‘me‘] ?sort #排序, 原地排序,不会生成排序后的副本,要想不改变原列表,而是生成排序后的副本,可以使用sorted() list1=[‘a‘,‘s‘,‘d‘,‘f‘,‘g‘,‘x‘] list1.sort() print(list1) #[‘a‘, ‘d‘, ‘f‘, ‘g‘, ‘s‘, ‘x‘] ?reverse #原地倒序 lst=[1,2,3] lst.reverse() print(lst) #[3, 2, 1]
4、元组操作
对“元组不可以修改”的理解:
元组的元素不能修改,但元组的元素的元素能修改。
①tuple()函数 #将任意的序列变为一个元组
#元组存在的意义:
①可以作为映射的键使用,而列表不可以
②元组作为很多内建函数和方法的返回值存在
5、字符串操作
①字符串格式化
②find #返回子串的索引,如果没有找到返回-1,index也是返回子串的索引,但如果没有找到会报错
str1="this is a test string" print(str1.find(‘is‘)) #2
③jion #将序列中的元素通过指定的符号连接成一个字符串 #注意序列中的元素必须是字符串
list1=[‘1‘,‘2‘,‘3‘,‘4‘] print(‘+‘.join(list1)) #为什么不是list1.join(‘+‘) ? #1+2+3+4
④ lower #将字符串中的大写变为小写,注意并不返回新生成的字符串,print(str1.lower())是错误的。
str1="HELLO WORLD" str1=str1.lower() #hello world
⑤replace #替换所有匹配的子串,返回新生成的字符串。
str1=‘this is a test‘ print(str1.replace(‘is‘,‘eez‘)) #theez eez a test
⑥split #按给定的分隔符切割字符串,和join是相反的过程
⑦strip #去掉开头和结尾的空格,并返回新生成的字符串
str2=‘ hello world ‘ print(str2.strip()) #hello world
6、字典操作
#字典是python中唯一的内建映射,由键取值而不是索引,键可以是数字、字符串、元组等不可变类型
#字典是无序的,for循环遍历元素的时候,是无序输出的
①如何得到一个字典?
#可以由(键,值)组成的序列得到。
item=[(‘name‘,‘zhoufeng‘),(‘age‘,24)] print(dict(item)) #{‘name‘: ‘zhoufeng‘, ‘age‘: 24}
#可以先建一个空的字典,然后给键赋值
dct={} dct[‘k1‘]=‘v1‘ dct[‘k2‘]=‘v2‘ print(dct) #{‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}
#可以通过fromkeys()
dct=dict.fromkeys([‘name‘,‘age‘]) #通过一个列表或者元组得到字典,这个列表中的每个元素将会是一个键,键的值默认是None print(dct) #{‘name‘: None, ‘age‘: None} dct=dict.fromkeys([‘name‘,‘age‘],‘kongzhi‘) #也可以自己提供值 print(dct) #{‘name‘: ‘kongzhi‘, ‘age‘: ‘kongzhi‘}
#待补充……
②返回字典长度(键-值对数量)
len(d)
③取所有的键、取所有的值、取所有的元素 #取某个键的值、给某个键赋值,这些基本方法和序列的一样
dict1={‘name‘:‘zhoufeng‘,‘sex‘:‘man‘,‘age‘:‘26‘} print(dict1.keys()) #以字符串列表形式输出所有的键 #dict_keys([‘age‘, ‘sex‘, ‘name‘]) print(dict1.values()) #以字符串列表形式输出所有的值 #dict_values([‘26‘, ‘man‘, ‘zhoufeng‘]) print(dict1.items()) #以元组列表的形式输出所有的元素,仅用于for循环当中 #dict_items([(‘age‘, ‘26‘), (‘sex‘, ‘man‘), (‘name‘, ‘zhoufeng‘)])
④键存在性检查
key in dct1 #检查键key是否在字典dct1中,比检查值是否在列表中效率高很多
⑤遍历字典
dict1={‘name‘:‘zhoufeng‘,‘sex‘:‘man‘,‘age‘:‘26‘} for key,value in dict1.items(): print(key,value) print("==============") #sex man #============== #name zhoufeng #============== #age 26 #==============
⑥clear() #清空一个字典,当有多个变量引用一个字典时,如果想清空他们引用的那个字典,这个方法就很有用了
dct={‘k1‘:‘v1‘,‘k2‘:‘v2‘} dct1=dct dct2=dct dct.clear() print(dct1) #{}
⑦get() #get方法返回某个键的值,与dct[‘key‘]访问方法不同的是,如果给定的键不存在,会返回None,而不是报错
item={‘name‘:‘zhoufeng‘,‘age‘:24} print(item.get(‘sex‘)) #None
⑧setdefault()
#setdefault方法也是返回某个键的值,如果给定的键不存在,会返回默认值(不像get方法总是返回None),更为强大的是,他会创建一个元素(键是你给定的,值是默认值)
dct={‘k1‘:‘v1‘,‘k2‘:‘v2‘} rst=dct.setdefault(‘k3‘,None) print(rst) print(dct) #None #{‘k2‘: ‘v2‘, ‘k1‘: ‘v1‘, ‘k3‘: None}
⑨ pop与popitem
#pop返回指定键的值并从字典中删除这个元素,注意它和列表的pop不一样,必须有参数,列表中的pop可以没参数,表示弹出最后一个元素,而popitem不能有参数,表示随机弹出一个元素
d={‘x‘:1,‘y‘:2} item=d.pop(‘x‘) print(item) print(d) #1 #{‘y‘: 2}
标签:
原文地址:http://www.cnblogs.com/zhoufeng1989/p/5578426.html