Python基本数据结构与用法详解【列表、元组、集合、字典】


Posted in Python onMarch 23, 2019

本文实例讲述了Python基本数据结构与用法。分享给大家供大家参考,具体如下:

列表

Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。以下是 Python 中列表的方法:

Python基本数据结构与用法详解【列表、元组、集合、字典】

下面示例演示了列表的大部分方法:

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]

注意:类似 insert, remove 或 sort 等修改列表的方法没有返回值。

将列表当做堆栈使用

列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。例如:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack [3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

将列表当作队列使用

也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")                       # Terry arrives
>>> queue.append("Graham")                    # Graham arrives
>>> queue.popleft()                            # The first to arrive now leaves
'Eric'
>>> queue.popleft()                            # The second to arrive now leaves
'John'
>>> queue                               # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

列表推导式

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

这里我们将列表中每个数值乘三,获得一个新的列表:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

现在我们玩一点小花样:

>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]

这里我们对序列里每一个元素逐个调用某方法:

>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

我们可以用 if 子句作为过滤器:

>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]

以下是一些关于循环和其它技巧的演示:

>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]

列表推导式可以使用复杂表达式或嵌套函数:

>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

嵌套列表解析

Python的列表还可以嵌套。以下实例展示了3X4的矩阵列表:

>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]

以下实例将3X4的矩阵列表转换为4X3列表:

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

以下实例也可以使用以下方法来实现:

>>> transposed = []
>>> for i in range(4):
...   transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

另外一种实现方法:

>>> transposed = []
>>> for i in range(4):
 ...   # the following 3 lines implement the nested listcomp
...   transposed_row = []
...   for row in matrix: ... transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

del 语句

使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。例如:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

也可以用 del 删除实体变量:

>>> del a

元组和序列

元组由若干逗号分隔的值组成,例如:

>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

如你所见,元组在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可能有或没有括号, 不过括号通常是必须的(如果元组是更大的表达式的一部分)。

集合

集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。

可以用大括号({})创建集合。注意:如果要创建一个空集合,你必须用 set() 而不是 {} ;后者创建一个空的字典。

以下是一个简单的演示:

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # fast membership testing
True
>>> 'crabgrass' in basket
False
>>> # Demonstrate set operations on unique letters from two words
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a            # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b          # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b          # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b             # letters in both a and b
{'a', 'c'}
>>> a ^ b             # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}
>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)             # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # fast membership testing
True
>>> 'crabgrass' in basket
False
>>> # Demonstrate set operations on unique letters from two words
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a               # unique letters in a
 {'a', 'r', 'b', 'c', 'd'}
>>> a - b                 # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b               # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b             # letters in both a and b
{'a', 'c'}
>>> a ^ b              # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}

字典

另一个非常有用的 Python 内建数据类型是字典。

序列是以连续的整数为索引,与此不同的是,字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。

理解字典的最佳方式是把它看做无序的键=>值对集合。在同一个字典之内,关键字必须是互不相同。

一对大括号创建一个空的字典:{}

这是一个字典运用的简单例子:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
 ['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

构造函数 dict() 直接从键值对元组列表中构建字典。如果有固定的模式,列表推导式指定特定的键值对:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}

此外,字典推导可以用来创建任意键和值的表达式词典:

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

如果关键字只是简单的字符串,使用关键字参数指定键值对有时候更方便:

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

遍历技巧

在字典中遍历时,关键字和对应的值可以使用 items() 方法同时解读出来:

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...   print(k, v)
...
gallahad the pure
robin the brave

在序列中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到:

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...   print(i, v)
...
0 tic
1 tac
2 toe

同时遍历两个或更多的序列,可以使用 zip() 组合:

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...   print('What is your {0}? It is {1}.'.format(q, a))
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.

要反向遍历一个序列,首先指定这个序列,然后调用 reversesd() 函数:

>>> for i in reversed(range(1, 10, 2)):
... print(i)
...
9
7
5
3
1

要按顺序遍历一个序列,使用 sorted() 函数返回一个已排序的序列,并不修改原值:

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...   print(f)
...
apple
banana
orange
pear

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现类似ftp传输文件的网络程序示例
Apr 08 Python
Python中__init__和__new__的区别详解
Jul 09 Python
python中assert用法实例分析
Apr 30 Python
python通过zabbix api获取主机
Sep 17 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
Python远程视频监控程序的实例代码
May 05 Python
python对csv文件追加写入列的方法
Aug 01 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 Python
详解django中Template语言
Feb 22 Python
Python3读写ini配置文件的示例
Nov 06 Python
Python中的变量与常量
Nov 11 Python
Django异步任务之Celery的基本使用
Mar 23 #Python
深入解析Python小白学习【操作列表】
Mar 23 #Python
Python基础之条件控制操作示例【if语句】
Mar 23 #Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 #Python
详解python中sort排序使用
Mar 23 #Python
Python基础之函数的定义与使用示例
Mar 23 #Python
详解用Python练习画个美队盾牌
Mar 23 #Python
You might like
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
orm获取关联表里的属性值
2016/04/17 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
通信工程毕业生自荐信
2013/11/01 职场文书
员工拾金不昧表扬信
2014/01/09 职场文书
幼儿教育感言
2014/02/05 职场文书
文秘求职信范文
2014/04/10 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python