码迷,mamicode.com
首页 > 编程语言 > 详细

python基础知识---数据结构

时间:2016-06-12 20:14:45      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

一、python有很多内置数据结构,下面从不同角度将它们分类。

1、单值和集合

技术分享

单值类型的数据结构在内存中是连续存储的,所以一旦生成就无法改变,如果没有被引用了,则被系统回收,如果想改变单值类型的数据结构,python的做法是生成新的数据结构。

技术分享
a=1
print(id(a))
#2006314800
a=2                   
print(id(a))       
#2006314832       #尝试改变数字a,发现开辟了新的内存空间
View Code

集合类型的数据结构是复合而成的,比如

技术分享
 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 #由数字和元组组成的字典
View Code

 

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()              #取绝对值
View Code

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!
View Code

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]
View Code

4、元组操作
对“元组不可以修改”的理解:
元组的元素不能修改,但元组的元素的元素能修改。

①tuple()函数       #将任意的序列变为一个元组

#元组存在的意义:
①可以作为映射的键使用,而列表不可以
②元组作为很多内建函数和方法的返回值存在


5、字符串操作
①字符串格式化


②find     #返回子串的索引,如果没有找到返回-1,index也是返回子串的索引,但如果没有找到会报错
技术分享
str1="this is a test string"
print(str1.find(is))
#2
View Code
③jion    #将序列中的元素通过指定的符号连接成一个字符串     #注意序列中的元素必须是字符串
技术分享
list1=[1,2,3,4]
print(+.join(list1))                  #为什么不是list1.join(‘+‘) ?   
#1+2+3+4
View Code
④ lower     #将字符串中的大写变为小写,注意并不返回新生成的字符串,print(str1.lower())是错误的。
技术分享
str1="HELLO WORLD"

str1=str1.lower()
#hello world
View Code
⑤replace    #替换所有匹配的子串,返回新生成的字符串。
技术分享
str1=this is a test
print(str1.replace(is,eez))
#theez eez a test
View Code
⑥split   #按给定的分隔符切割字符串,和join是相反的过程
⑦strip       #去掉开头和结尾的空格,并返回新生成的字符串
技术分享
str2= hello world   
print(str2.strip())
#hello world
View Code

 

6、字典操作

#字典是python中唯一的内建映射,由键取值而不是索引,键可以是数字、字符串、元组等不可变类型

#字典是无序的,for循环遍历元素的时候,是无序输出的

①如何得到一个字典?

#可以由(键,值)组成的序列得到。
技术分享
item=[(name,zhoufeng),(age,24)]                       
print(dict(item))
#{‘name‘: ‘zhoufeng‘, ‘age‘: 24}
View Code
#可以先建一个空的字典,然后给键赋值
技术分享
dct={}
dct[k1]=v1
dct[k2]=v2
print(dct)
#{‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}
View Code
#可以通过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‘}
View Code
#待补充……

②返回字典长度(键-值对数量)
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‘)])
View Code

④键存在性检查
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
#==============
View Code

 

⑥clear()     #清空一个字典,当有多个变量引用一个字典时,如果想清空他们引用的那个字典,这个方法就很有用了
技术分享
dct={k1:v1,k2:v2}
dct1=dct
dct2=dct
dct.clear()
print(dct1)
#{}
View Code

 

⑦get()       #get方法返回某个键的值,与dct[‘key‘]访问方法不同的是,如果给定的键不存在,会返回None,而不是报错
技术分享
item={name:zhoufeng,age:24}
print(item.get(sex))
#None
View Code

⑧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}
View Code

⑨ pop与popitem
#pop返回指定键的值并从字典中删除这个元素,注意它和列表的pop不一样,必须有参数,列表中的pop可以没参数,表示弹出最后一个元素,而popitem不能有参数,表示随机弹出一个元素
技术分享
d={x:1,y:2}
item=d.pop(x)
print(item)
print(d)
#1
#{‘y‘: 2}
View Code
 



python基础知识---数据结构

标签:

原文地址:http://www.cnblogs.com/zhoufeng1989/p/5578426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!