Python数据结构与算法--数据类型

从数据类型开始

Python支持面向对象的编程范式,这意味着Python把数据看成解决问题的关键. 在Python中,类似其他的面向对象的编程语言, 我们定义一个类,用来描述数据是什么 (状态) 和数据能做些什么 (行为). 类和抽象数据类型相似,因为一个类的用户只看数据项的状态和行为. 数据项在面向对象编程中被称为对象. 对象是类的实例.

本文地址:http://www.cnblogs.com/archimedes/p/python-datastruct-algorithm-basedatatypes.html,转载请注明源地址。

内置的原子数据类型

我们从原子数据类型开始我们的回顾. Python有两种主要的内建数据类:intfloat. 标准的算术操作:+, -, *, /, and ** (幂运算), 可以使用括号改变运算优先级.其他非常有用的操作符为取余运算%, 和整数除法运算//. 注意:当两个整数相除的时候,结果是一个浮点型数. 整数除法操作返回截断小数之后的整数部分.

>>> print 2+3*4
14
>>> print (2+3)*4
20
>>> print 2**10
1024
>>> print 6/3
2
>>> print 7/3
2
>>> print 7//3
2
>>> print 7%3
1
>>> print 3/6
0
>>> print 3//6
0
>>> print 3%6
3
>>> print 2**100
1267650600228229401496703205376

boolean类型,由Python的 bool 类提供实现,在表示真值的时候非常有用. 对于一个boolean对象而言,只有两个值:True and False,标准的boolean类型操作: andor, 和not.

>>> True
True
>>> False
False
>>> False or True
True
>>> not (False or True)
False
>>> True and True
True

Boolean数据对象也被用于表示比较运算符的结果,比如:相等 (==) 和大于 (>). 另外, 关系运算符和逻辑运算符可以组合在一起来解决复杂的逻辑问题. 表1 展示了逻辑关系操作,后面还展示了相关的例子.

表1 : 逻辑与关系操作
      操作名        操作符 说明
小于 < 小于操作符
大于 > 大于操作符
小于等于 <= 小于等于操作符
大于等于 >= 大于等于操作符
等于 == 等于操作符
不等于 != 不等于操作符
逻辑与 and 两个同时为True时候才为True
逻辑或 or 两个中至少有一个为True,结果为True
逻辑非 not 否定, False 变为True, True 变为False

示例代码:

>>> print(5==10)
False
>>> print(10 > 5)
True
>>> print((5 >= 1) and (5 <= 10))
True

标识符以名字的形式被用于程序语言. 在Python中, 标识符以字母或一条下划线开始,大小写敏感且可以是任意长度.记住经常使用变量来表达你的意思,使得你的代码更加简单的被阅读和理解.一个 Python 变量被创建一旦被赋予左值. 赋值语句提供了一种联系变量和值的方法. 变量保持一个指向数据区域的引用,并不是数据本身. 看下面的代码:

>>> theSum = 0
>>> theSum
0
>>> theSum += 1
>>> theSum
1
>>> theSum = True
>>> theSum
True

内建集合数据类型

作为数据类型和布尔类型的补充, Python还有一些内建的集合类型. Lists, strings, 和 tuples(元组)都是有序集合,非常类似普通的结构但是有些特殊的不同点,所以必须理解它们这样才能正确地使用它们. Sets 和 dictionaries 是无序集合.

list 是一个空的或多个指向Python数据对象类型的引用. Lists 通常写为用方括号包含的一些用逗号分隔的值. 空表表示为 [ ]. Lists内部的元素可以是不同的数据对象,  下面的例子展示了一个list中不同的数据类型.

>>> [1,3,True,6.5]
[1, 3, True, 6.5]
>>> myList = [1,3,True,6.5]
>>> myList
[1, 3, True, 6.5]

当给list赋值的时候, list被返回. 但是, 想在 list上作操, 就需要将其赋值给一个对象.

lists 被认为是连续的序列, 它们支持一些可用于其他序列的通用操作. 表2 展示了这些操作,接着给出一些例子来进一步说明它们的应用.

表 2: Python中序列的通用操作
操作名 操作符               解释                
索引 [ ] 访问 sequence中的元素
连接 + 合并sequences
重复 * 连续重复次数
成员 in 判断元素是否在quence中
长度 len 计算sequence的长度
分片 [ : ] 给sequence分片

注意到lists (序列)的索引从0开始. 取片操作, myList[1:3], 返回list的数据项,起始于1结束但不包含3.有时, 你想初始化一个list. 可以使用重复来快速的完成. 例如,

>>> myList = [0]*6
>>> myList
[0, 0, 0, 0, 0, 0]

通过下面的例子很容易理解:

>>> myList = [1,2,3,4]
>>> A=[myList]*3
>>> print(A)
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
>>> myList[2]=45
>>> print(A)
[[1, 2, 45, 4], [1, 2, 45, 4], [1, 2, 45, 4]]

Lists 提供大量用于构建数据结构的方法.表3 提供概要. 接着是一些例子.

表 3: Python中list提供的方法
方法名 应用 说明
append alist.append(item) 在list的结尾添加一个项
insert alist.insert(i,item) 在list的第i个位置插入一个项
pop alist.pop() 移除并返回list中的最后一个元素
pop alist.pop(i) 移除并返回list中的第i个位置的元素
sort alist.sort() 排序修改list
reverse alist.reverse() 将list倒序操作
del del alist[i] 删除第i个位置的元素
index alist.index(item) 返回第一次出现 item 的索引
count alist.count(item) 返回出现 item 的次数
remove alist.remove(item) 删除第一次出现的 item 

list中的方法示例代码:

>>> myList = [1024, 3, True, 6.5]
>>> myList.append(False)
>>> print(myList)
[1024, 3, True, 6.5, False]
>>> myList.insert(2, 4.5)
>>> print(myList)
[1024, 3, 4.5, True, 6.5, False]
>>> print(myList.pop())
False
>>> print(myList)
[1024, 3, 4.5, True, 6.5]
>>> print(myList.pop(1))
3
>>> print(myList)
[1024, 4.5, True, 6.5]
>>> myList.pop(2)
True
>>> print(myList)
[1024, 4.5, 6.5]
>>> myList.sort()
>>> print(myList)
[4.5, 6.5, 1024]
>>> myList.reverse()
>>> print(myList)
[1024, 6.5, 4.5]
>>> print(myList.count(6.5))
1
>>> print(myList.index(4.5))
2
>>> myList.remove(6.5)
>>> print(myList)
[1024, 4.5]
>>> del myList[0]
>>> print(myList)
[4.5]

即使像整型这样的对象也可以调用方法如下:

>>> (54).__add__(21)
75

上面的代码中我们使整型对象 54 执行 add 方法(称为 __add__ ) 并且传递 21 作为被加数. 结果是它们的和, 75. 当然, 我们通常写作 54+21. 在后面还将详细介绍这个方法.

一个Python经常用来连接lists的常见函数: range 函数.range 产生了一个范围内的对象. 通过使用 list 函数, 可以看到list中指定范围内的值,如下面的代码所示:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(5,10)
[5, 6, 7, 8, 9]
>>> list(range(5,10))
[5, 6, 7, 8, 9]
>>> list(range(5,10,2))
[5, 7, 9]
>>> list(range(10,1,-1))
[10, 9, 8, 7, 6, 5, 4, 3, 2]

Strings 包含0个或多个数字或其他的字符的连续的顺序集合. 我们称这些为字母, 数字和其他的符号字符.

>>> "David"
‘David‘
>>> myName = "David"
>>> myName[3]
‘i‘
>>> myName * 2
‘DavidDavid‘
>>> len(myName)
5

既然strings是序列, all of the 上面提到的序列的所有操作都可以使用. 然而, strings 还有一些自身的方法, 如表 4所示. 例如,

>>> myName
‘David‘
>>> myName.upper()
‘DAVID‘
>>> myName.center(10)
‘  David   ‘
>>> myName.find(‘v‘)
2
>>> myName.split(‘v‘)
[‘Da‘, ‘id‘]
表 4: Python中Strings 提供的方法
方法名 应用 说明
center astring.center(w) 返回一个以 w 为宽度的居中字符串
count astring.count(item) 返回字符串中包含 item 的个数
ljust astring.ljust(w) 返回一个以 w 为宽度的左对齐字符串
lower astring.lower() 返回string的小写形式
rjust astring.rjust(w) 返回一个以 w 为宽度的右对齐字符串 
find astring.find(item) 返回第一次出现 item 的索引
split astring.split(schar) 将string以 schar为分隔符划分为子串

lists 和 strings的主要区别是 lists 可以修改但是 strings 不能修改. 例如, 你可以通过索引和赋值改变项的值. 对于string不能发生改变.

>>> myList = [1,3,True,6.5]
>>> myList[0] = 2 ** 10
>>> myList
[1024, 3, True, 6.5]
>>> myName = ‘David‘
>>> myName[0] = ‘X‘
Traceback (most recent call last):
  File "<pyshell#81>", line 1, in <module>
    myName[0] = ‘X‘
TypeError: ‘str‘ object does not support item assignment

Tuples(元组)非常类似于lists,因为它们的元素都可以是不同类型的.不同的是tuple是不可以变的, 就像 string. Tuples是一组用圆括号包围的用逗号分隔的值. 作为序列,你可以使用上面介绍的所有方法. 例如:

>>> myTuple = (2, True, 4.32)
>>> myTuple
(2, True, 4.32)
>>> len(myTuple)
3
>>> myTuple[0]
2
>>> myTuple * 3
(2, True, 4.32, 2, True, 4.32, 2, True, 4.32)
>>> myTuple[0:2]
(2, True)

然而,假如你试图修改元组中的元素,就会出错,如下所示.

>>> myTuple[1] = false
Traceback (most recent call last):
  File "<pyshell#92>", line 1, in <module>
    myTuple[1] = false
NameError: name ‘false‘ is not defined

set 是一个包含0个或多个不可变Python对象的无序集合.  空set 表示为 set(). Sets 的元素类型多样.

>>> {3,6,"cat",4.3,False}
set([False, 3, 4.3, 6, ‘cat‘])
>>> mySet = {3,6,"cat",4.3,False}
>>> mySet
set([False, 3, 4.3, 6, ‘cat‘])
表 5: Python中的Set操作
操作名 操作 说明
成员 in 判断成员
长度 len 返回set中的元素个数
| aset | otherset 返回一个新的set,作为并集
& aset & otherset 返回一个新的set,作为交集
- aset - otherset 返回一个新的set,作为差集
<= aset <= otherset 判断第一个集合是否为第二个集合的子集
>>> {3,6,"cat",4.3,False}
set([False, 3, 4.3, 6, ‘cat‘])
>>> mySet = {3,6,"cat",4.3,False}
>>> mySet
set([False, 3, 4.3, 6, ‘cat‘])
>>>
>>> mySet = {3,6,"cat",4.3,False}
>>> len(mySet)
5
>>> False in mySet
True
>>> "dog" in mySet
False
>>> yourSet = {3,1,"cat",4.7,False}
>>> mySet | yourSet
set([False, 1, 3, 6, 4.3, ‘cat‘, 4.7])
>>> mySet & yourSet
set([False, 3, ‘cat‘])
>>> mySet - yourSet
set([4.3, 6])
>>> mySet <= yourSet
False

Sets 提供的方法类似于数学中的集合. 表 6 提供了概要. 例子如下所示:

表 6: Python中Sets提供的方法
方法名 应用 说明
union aset.union(otherset) 返回一个新的set,元素由两个set的并集组成
intersection aset.intersection(otherset) 返回一个新的set ,元素由两个set的交集组成
difference aset.difference(otherset) 返回一个新的set,元素由两个set的差组成
issubset aset.issubset(otherset) 判断第一个set中的所有元素是不是在第二个set中
add aset.add(item) 向set中添加元素
remove aset.remove(item) 从set中删除元素
pop aset.pop() 从set中删除任意元素
clear aset.clear() 将set中所有元素删除
>>> mySet = {False, 4.5, 3, 6, ‘cat‘}
>>> yourSet = {99, 3, 100}
>>> mySet.union(yourSet)
set([4.5, False, 3, 100, 6, ‘cat‘, 99])
>>> mySet | yourSet
set([4.5, False, 3, 100, 6, ‘cat‘, 99])
>>> mySet.intersection(yourSet)
set([3])
>>> mySet & yourSet
set([3])
>>> mySet.difference(yourSet)
set([4.5, False, 6, ‘cat‘])
>>> mySet - yourSet
set([4.5, False, 6, ‘cat‘])
>>> {3, 100}.issubset(yourSet)
True
>>> {3, 100}<=yourSet
True
>>> mySet.add("house")
>>> mySet
set([4.5, False, 3, 6, ‘house‘, ‘cat‘])
>>> mySet.remove(4.5)
>>> mySet
set([False, 3, 6, ‘house‘, ‘cat‘])
>>> mySet.pop()
False
>>> mySet
set([3, 6, ‘house‘, ‘cat‘])
>>> mySet.clear()
>>> mySet
set([])

Dictionaries(字典)既有方法又有操作. 表7 和 表 8 描述了它们.

表 7: Python中Dictionaries 提供的操作
操作符 应用 说明
[] myDict[k] 返回键为 k 的值,否则发生错误
in key in adict 当key在字典中的时候返回 True 否则返回 False 
del del adict[key] 删除所有的 dictionary 元素
>>> phoneext = {‘david‘:1410, ‘brad‘:1137}
>>> phoneext
{‘brad‘: 1137, ‘david‘: 1410}
>>> phoneext.keys()
[‘brad‘, ‘david‘]
>>> phoneext.values()
[1137, 1410]
>>> phoneext.items()
[(‘brad‘, 1137), (‘david‘, 1410)]
>>> phoneext.get("kent")
表 8: Python中Dictionaries 提供的方法
方法名 应用 说明
keys adict.keys() 返回dictionary中的key
values adict.values() 返回dictionary中的值
items adict.items() 返回字典中的所有键-值对
get adict.get(k) 返回 对应的值,否则返回 None
get adict.get(k,alt) 返回 k 对应的值,否则返回 alt
时间: 2024-10-30 15:39:33

Python数据结构与算法--数据类型的相关文章

Python数据结构与算法--List和Dictionaries

Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还是牺牲了不常用的操作的性能来成全常用功能. 本文地址:http://www.cnblogs.com/archimedes/p/python-datastruct-algorithm-list-dictionary.html,转载请注明源地址. 设计者有很多的选择,使他们实现list的数据结构.这些选

Python数据结构与算法--算法分析

在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义域是输入数据的长度,值域通常是执行步骤数量(时间复杂度)或者存储器位置数量(空间复杂度).算法分析是计算复杂度理论的重要组成部分. 本文地址:http://www.cnblogs.com/archimedes/p/python-datastruct-algorithm-analysis.html,转

python数据结构与算法 38 分析树

分析树 树的结构完成以后,该是时候看看它能做点什么实事儿了.这一节里,我们研究一下分析树.分析树能够用于真实世界的结构表示,象语法或数学表达式一类的. 图1 一个简单语句的分析树 图1所示是一个简单语句的层级结构,把语句表示为树结构可以让我们用子树来分析句子的组成部分. 图2 ((7+3)?(5?2))的分析树 我们也可以把数学表达式如((7+3)?(5?2))表示为分析树,如图2.此前我们研究过完全括号表达式,这个表达式表达了什么呢?我们知道乘法的优先级比加减要高,但因为括号的关系,在做乘法之

python数据结构与算法 36 树的基本概念

树 学习目标 理解什么是树及使用方法 学会使用树实现映射 用列表实现树 用类和引用实现树 用递归实现树 用堆实现优先队列 树的例子 前面我们学习过栈和队列这类线性数据结构,并且体验过递归,现在我们学习另一种通用数据结构,叫做树.树在计算机科学中应用广泛,象操作系统.图形学.数据库系统.网络等都要用到树.树和他们在自然界中的表哥--植物树--非常相似,树也有根,有分枝,有叶子.不同之处是,数据结构的树,根在顶上,而叶子在底部. 在开始学习之前,我们来研究几个普通的例子.第一个是生物学上的分级树.图

python数据结构与算法 37 树的实现

树的实现 记住上一节树的定义,在定义的基础上,我们用以下的函数创建并操作二叉树: BinaryTree() 创建一个二叉树实例 getLeftChild() 返回节点的左孩子 getRightChild() 返回节点的右孩子 setRootVal(val) 把val变量值赋给当前节点 getRootVal() 返回当前节点对象. insertLeft(val) 创建一个新二叉树作为当前节点的左孩子 insertRight(val) 创建一个新二叉树作为当前节点的右孩子. 实现树的关键点是合适的存

python数据结构与算法 34 归并排序

归并排序 在提高排序算法性能的方法中,有一类叫做分而治之.我们先研究其中第一种叫做归并排序.归并排序使用递归的方法,不停地把列表一分为二.如果列表是空或只有一个元素,那么就是排好序的(递归基点),如果列表有超过1个的元素,那么切分列表并对两个子列表递归使用归并排序.一旦这两个列表排序完成,称为"归并"的基本操作开始执行.归并是把两个有序列表合并成一个新的有序列表的过程.图10是我们熟悉的列表样例分解过程,图11是归并的过程. 图10  切分过程 图11  归并过程 以下是mergeSo

python数据结构与算法 35 快速排序

快速排序 快速排序也使用了分而治之的策略来提高性能,而且不需要额外的内存,但是这么做的代价就是,列表不是对半切分的,因而,性能上就有所下降. 快速排序选择一个数值,一般称为"轴点",虽然有很多选取轴点的方法,我们还是简单地把列表中第一个元素做为轴点了.轴点的作用是帮助把列表分为两个部分.列表完成后,轴点所在的位置叫做"切分点",从这一点上把列表分成两部分供后续调用. 图12所示,54将作为轴点.这个例子我们已经排过多次了,我们知道54在排好序后将处于现在31的位置上

python数据结构与算法 39 树的遍历

树的遍历 在学习完成树的基本结构以后,我们开始研究一些树的应用模式.访问树的全部节点,一般有三种模式,这些模式的不同之处,仅在于访问节点的顺序不同.我们把这种对节点的访问称为"遍历",这三种遍历模式叫做前序.中序和后序.下面我们对遍历模式作更仔细的定义,同时研究使用这延续模式的例子. 前序遍历 在前序遍历中,先访问根节点,然后用递归方式前序遍历它的左子树,最后递归方式前序遍历右子树. 中序遍历 在中序遍历中,先递归中序遍历左子树,然后访问根节点,最后递归中序遍历右子树. 后序遍历 在后

【Python&amp;数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的