Python数据结构与算法--数据类型
从数据类型开始
Python支持面向对象的编程范式,这意味着Python把数据看成解决问题的关键. 在Python中,类似其他的面向对象的编程语言, 我们定义一个类,用来描述数据是什么 (状态) 和数据能做些什么 (行为). 类和抽象数据类型相似,因为一个类的用户只看数据项的状态和行为. 数据项在面向对象编程中被称为对象. 对象是类的实例.
本文地址:http://www.cnblogs.com/archimedes/p/python-datastruct-algorithm-basedatatypes.html,转载请注明源地址。
内置的原子数据类型
我们从原子数据类型开始我们的回顾. Python有两种主要的内建数据类:int
和float
. 标准的算术操作:+, -, *, /, 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类型操作: and
, or
, 和not
.
>>> True
True
>>> False
False
>>> False or True
True
>>> not (False or True)
False
>>> True and True
True
Boolean数据对象也被用于表示比较运算符的结果,比如:相等 (==) 和大于 (>). 另外, 关系运算符和逻辑运算符可以组合在一起来解决复杂的逻辑问题. 表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 展示了这些操作,接着给出一些例子来进一步说明它们的应用.
操作名 | 操作符 | 解释 |
---|---|---|
索引 | [ ] | 访问 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 提供概要. 接着是一些例子.
方法名 | 应用 | 说明 |
---|---|---|
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']
方法名 | 应用 | 说明 |
---|---|---|
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'])
操作名 | 操作 | 说明 |
---|---|---|
成员 | 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 提供了概要. 例子如下所示:
方法名 | 应用 | 说明 |
---|---|---|
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 描述了它们.
操作符 | 应用 | 说明 |
---|---|---|
[] |
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")
方法名 | 应用 | 说明 |
---|---|---|
keys |
adict.keys() |
返回dictionary中的key |
values |
adict.values() |
返回dictionary中的值 |
items |
adict.items() |
返回字典中的所有键-值对 |
get |
adict.get(k) |
返回 k 对应的值,否则返回 None |
get |
adict.get(k,alt) |
返回 k 对应的值,否则返回 alt |
您还可能感兴趣:
Python数据结构与算法--数据类型的更多相关文章
- Python数据结构与算法--List和Dictionaries
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- Python数据结构与算法之图的广度优先与深度优先搜索算法示例
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...
- 【Python&数据结构】 抽象数据类型 Python类机制和异常
这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...
- Python 数据结构和算法
阅读目录 什么是算法 算法效率衡量 算法分析 常见时间复杂度 Python内置类型性能分析 数据结构 顺序表 链表 栈 队列 双端队列 排序与搜索 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归 ...
- python数据结构与算法——哈希表
哈希表 学习笔记 参考翻译自:<复杂性思考> 及对应的online版本:http://greenteapress.com/complexity/html/thinkcomplexity00 ...
- python数据结构与算法之问题求解实例
关于问题求解,书中有一个实际的案例. 上图是一个交叉路口的模型,现在问题是,怎么安排红绿灯才可以保证相应的行驶路线互不交错. 第一步,就是把问题弄清楚. 怎么能让每一条行驶路线不冲突呢? 其实,就是给 ...
随机推荐
- MDX 占比同比环比
http://blog.csdn.net/hero_hegang/article/details/9072889
- (转)linux文件读写的流程
转自http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0 在<linux内核虚拟文件系统浅析>这篇文章中,我们看到文件是如何被打开 ...
- 什么是作用域链,什么是原型链,它们的区别,在js中它们具体指什么?
什么是作用域链,什么是原型链. 作用域是针对变量的,比如我们创建了一个函数,函数里面又包含了一个函数,那么现在就有三个作用域 全局作用域==>函数1作用域==>函数2作用域 作用域的特点就 ...
- java正则表达式小练习(IP地址检测、排序,叠词的处理,邮件地址的获取)
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.util.reg ...
- 如何编写Angular指令
[20140917]Angular:如何编写一个指令 *:first-child { margin-top: 0 !important; } body>*:last-child { margin ...
- centos nfs配置--转载
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-nfs-client-config.html 18.6. NFS Server ...
- 字符编码(ASCII,Unicode和UTF-8) 和 大小端
本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...
- 内存中OLTP(Hekaton)里的事务日志记录
在今天的文章里,我想详细讨论下内存中OLTP里的事务日志如何写入事务日志.我们都知道,对于你的内存优化表(Memory Optimized Tables),内存中OLTP提供你2个持久性(durabi ...
- Vim杂记:markdown插件
一.安装插件 从以下地址下载压缩包 github下载:https://github.com/plasticboy/vim-markdown plasticboy下载:http://plasticboy ...
- BZOJ1087状压DP 解题报告
1087: [SCOI2005]互不侵犯King Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的 ...