首页 后端开发 Python教程 Python常见数据结构详解

Python常见数据结构详解

Jun 16, 2016 am 08:43 AM
python 数据结构

本文详细罗列归纳了Python常见数据结构,并附以实例加以说明,相信对读者有一定的参考借鉴价值。

总体而言Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)映射(如字典)以及集合(set)是三类主要的容器。

一、序列(列表、元组和字符串)

序列中的每个元素都有自己的编号。Python中有6种内建的序列。其中列表和元组是最常见的类型。其他包括字符串、Unicode字符串、buffer对象和xrange对象。下面重点介绍下列表、元组和字符串。

1、列表

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

(1)、创建

通过下面的方式即可创建一个列表:

list1=['hello','world']
print list1
list2=[1,2,3]
print list2
登录后复制

输出:

['hello', 'world']
[1, 2, 3]
登录后复制

可以看到,这中创建方式非常类似于javascript中的数组。

(2)、list函数

通过list函数(其实list是一种类型而不是函数)对字符串创建列表非常有效:

list3=list("hello")
print list3
登录后复制

输出:

['h', 'e', 'l', 'l', 'o']

登录后复制

2、元组

元组与列表一样,也是一种序列,唯一不同的是元组不能被修改(字符串其实也有这种特点)。

(1)、创建

t1=1,2,3
t2="jeffreyzhao","cnblogs"
t3=(1,2,3,4)
t4=()
t5=(1,)
print t1,t2,t3,t4,t5
登录后复制

输出:

(1, 2, 3) ('jeffreyzhao', 'cnblogs') (1, 2, 3, 4) () (1,)

登录后复制

从上面我们可以分析得出:

a、逗号分隔一些值,元组自动创建完成;

b、元组大部分时候是通过圆括号括起来的;

c、空元组可以用没有包含内容的圆括号来表示;

d、只含一个值的元组,必须加个逗号(,);

(2)、tuple函数

tuple函数和序列的list函数几乎一样:以一个序列(注意是序列)作为参数并把它转换为元组。如果参数就算元组,那么该参数就会原样返回:

t1=tuple([1,2,3])
t2=tuple("jeff")
t3=tuple((1,2,3))
print t1
print t2
print t3
t4=tuple(123)
print t45
登录后复制

输出:

(1, 2, 3)
('j', 'e', 'f', 'f')
(1, 2, 3)

登录后复制

Traceback (most recent call last):
File "F:\Python\test.py", line 7, in
t4=tuple(123)
TypeError: 'int' object is not iterable

3、字符串

(1)创建

str1='Hello world'
print str1
print str1[0]
for c in str1:
  print c
登录后复制

输出:

Hello world
H
H
e
l
l
o
 
w
o
r
l
d
登录后复制

(2)格式化

字符串格式化使用字符串格式化操作符即百分号%来实现。

str1='Hello,%s' % 'world.'
print str1
登录后复制

格式化操作符的右操作数可以是任何东西,如果是元组或者映射类型(如字典),那么字符串格式化将会有所不同。

strs=('Hello','world') #元组
str1='%s,%s' % strs
print str1
d={'h':'Hello','w':'World'} #字典
str1='%(h)s,%(w)s' % d
print str1
登录后复制

输出:

Hello,world
Hello,World

登录后复制

注意:如果需要转换的元组作为转换表达式的一部分存在,那么必须将它用圆括号括起来

str1='%s,%s' % 'Hello','world'
print str1
登录后复制

输出:

Traceback (most recent call last):
 File "F:\Python\test.py", line 2, in <module>
  str1='%s,%s' % 'Hello','world'
TypeError: not enough arguments for format string

登录后复制

如果需要输出%这个特殊字符,毫无疑问,我们会想到转义,但是Python中正确的处理方式如下:

str1='%s%%' % 100
print str1
登录后复制

输出:

100%
登录后复制

对数字进行格式化处理,通常需要控制输出的宽度和精度

from math import pi
str1='%.2f' % pi #精度2
print str1
str1='%10f' % pi #字段宽10
print str1
str1='%10.2f' % pi #字段宽10,精度2
print str1
登录后复制

输出:

3.14
 3.141593
   3.14

登录后复制

字符串格式化还包含很多其他丰富的转换类型,可参考官方文档。

Python中在string模块还提供另外一种格式化值的方法:模板字符串。它的工作方式类似于很多UNIX Shell里的变量替换,如下所示:

from string import Template
str1=Template('$x,$y!')
str1=str1.substitute(x='Hello',y='world')
print str1
登录后复制

输出:

Hello,world!

登录后复制
登录后复制
登录后复制

如果替换字段是单词的一部分,那么参数名称就必须用括号括起来,从而准确指明结尾:

from string import Template
str1=Template('Hello,w${x}d!')
str1=str1.substitute(x='orl')
print str1
登录后复制

输出:

Hello,world!

登录后复制
登录后复制
登录后复制

如要输出$符,可以使用$$输出:

from string import Template
str1=Template('$x$$')
str1=str1.substitute(x='100')
print str1
登录后复制

输出:

100$
登录后复制

除了关键字参数之外,模板字符串还可以使用字典变量提供键值对进行格式化:

from string import Template
d={'h':'Hello','w':'world'}
str1=Template('$h,$w!')
str1=str1.substitute(d)
print str1
登录后复制

输出:

Hello,world!

登录后复制
登录后复制
登录后复制

除了格式化之外,Python字符串还内置了很多实用方法,可参考官方文档,这里不再列举。

4、通用序列操作(方法)

从列表、元组以及字符串可以“抽象”出序列的一些公共通用方法(不是你想像中的CRUD),这些操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员。除此之外,还有计算序列长度、最大最小元素等内置函数。

(1)索引

str1='Hello'
nums=[1,2,3,4]
t1=(123,234,345)
print str1[0]
print nums[1]
print t1[2]
登录后复制

输出

H
2
345

登录后复制

索引从0(从左向右)开始,所有序列可通过这种方式进行索引。神奇的是,索引可以从最后一个位置(从右向左)开始,编号是-1:

str1='Hello'
nums=[1,2,3,4]
t1=(123,234,345)
print str1[-1]
print nums[-2]
print t1[-3]
登录后复制

输出:

o
3
123

登录后复制

(2)分片

分片操作用来访问一定范围内的元素。分片通过冒号相隔的两个索引来实现:

nums=range(10)
print nums
print nums[1:5]
print nums[6:10]
print nums[1:]
print nums[-3:-1]
print nums[-3:] #包括序列结尾的元素,置空最后一个索引
print nums[:] #复制整个序列
登录后复制

输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4]
[6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[7, 8]
[7, 8, 9]

登录后复制

不同的步长,有不同的输出:

nums=range(10)
print nums
print nums[0:10] #默认步长为1 等价于nums[1:5:1]
print nums[0:10:2] #步长为2
print nums[0:10:3] #步长为3
 
##print nums[0:10:0] #步长为0
print nums[0:10:-2] #步长为-2
登录后复制

输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
[0, 3, 6, 9]
[]

登录后复制

(3)序列相加

str1='Hello'
str2=' world'
print str1+str2
num1=[1,2,3]
num2=[2,3,4]
print num1+num2
print str1+num1
登录后复制

输出:

Hello world
[1, 2, 3, 2, 3, 4]

登录后复制

Traceback (most recent call last):
File "F:\Python\test.py", line 7, in
print str1+num1
TypeError: cannot concatenate 'str' and 'list' objects

(4)乘法

print [None]*10
str1='Hello'
print str1*2
num1=[1,2]
print num1*2
print str1*num1
登录后复制

输出:

[None, None, None, None, None, None, None, None, None, None]

HelloHello
[1, 2, 1, 2]

登录后复制

Traceback (most recent call last):
File "F:\Python\test.py", line 5, in
print str1*num1
TypeError: can't multiply sequence by non-int of type 'list'

(5)成员资格

in运算符会用来检查一个对象是否为某个序列(或者其他类型)的成员(即元素):

str1='Hello'
print 'h' in str1 
print 'H' in str1
num1=[1,2]
print 1 in num1
登录后复制

输出:

False
True
True

登录后复制

(6)长度、最大最小值

通过内建函数len、max和min可以返回序列中所包含元素的数量、最大和最小元素。

str1='Hello'
print len(str1) 
print max(str1)
print min(str1)
num1=[1,2,1,4,123]
print len(num1) 
print max(num1)
print min(num1)
登录后复制

输出:

5
o
H
5
123
1

登录后复制

二、映射(字典)

映射中的每个元素都有一个名字,如你所知,这个名字专业的名称叫键。字典(也叫散列表)是Python中唯一内建的映射类型。

1、键类型

字典的键可以是数字、字符串或者是元组,键必须唯一。在Python中,数字、字符串和元组都被设计成不可变类型,而常见的列表以及集合(set)都是可变的,所以列表和集合不能作为字典的键。键可以为任何不可变类型,这正是Python中的字典最强大的地方。

list1=["hello,world"]
set1=set([123])
d={}
d[1]=1
print d
d[list1]="Hello world."
d[set1]=123
print d
登录后复制

输出:

{1: 1}

登录后复制

Traceback (most recent call last):
File "F:\Python\test.py", line 6, in
d[list1]="Hello world."
TypeError: unhashable type: 'list'

2、自动添加

即使键在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。

3、成员资格

表达式item in d(d为字典)查找的是键(containskey),而不是值(containsvalue)。

Python字典强大之处还包括内置了很多常用操作方法,可参考官方文档,这里不再列举。

思考:根据我们使用强类型语言的经验,比如C#和Java,我们肯定会问Python中的字典是线程安全的吗?

三、集合

集合(Set)在Python 2.3引入,通常使用较新版Python可直接创建,如下所示:

strs=set(['jeff','wong','cnblogs'])
nums=set(range(10))
登录后复制

看上去,集合就是由序列(或者其他可迭代的对象)构建的。集合的几个重要特点和方法如下:

1、副本是被忽略的

集合主要用于检查成员资格,因此副本是被忽略的,如下示例所示,输出的集合内容是一样的。

set1=set([0,1,2,3,0,1,2,3,4,5])
print set1
 
set2=set([0,1,2,3,4,5])
print set2
登录后复制

输出如下:

set([0, 1, 2, 3, 4, 5])
set([0, 1, 2, 3, 4, 5])

登录后复制

2、集合元素的顺序是随意的

这一点和字典非常像,可以简单理解集合为没有value的字典。

strs=set(['jeff','wong','cnblogs'])
print strs
登录后复制

输出如下:

set(['wong', 'cnblogs', 'jeff'])

登录后复制

3、集合常用方法

a、交集union

set1=set([1,2,3])
set2=set([2,3,4])
set3=set1.union(set2)
print set1
print set2
print set3
登录后复制

输出:

set([1, 2, 3])
set([2, 3, 4])
set([1, 2, 3, 4])

登录后复制

union操作返回两个集合的并集,不改变原有集合。使用按位与(OR)运算符“|”可以得到一样的结果:

set1=set([1,2,3])
set2=set([2,3,4])
set3=set1|set2
print set1
print set2
print set3
登录后复制

输出和上面union操作一模一样的结果。

其他常见操作包括&(交集),<=,>=,-,copy()等等,这里不再列举。

set1=set([1,2,3])
set2=set([2,3,4])
set3=set1&set2
print set1
print set2
print set3
print set3.issubset(set1)
set4=set1.copy()
print set4
print set4 is set1
登录后复制

输出如下:

set([1, 2, 3])
set([2, 3, 4])
set([2, 3])
True
set([1, 2, 3])
False

登录后复制

b、add和remove

和序列添加和移除的方法非常类似,可参考官方文档:

set1=set([1])
print set1
set1.add(2)
print set1
set1.remove(2)
print set1
print set1
print 29 in set1
set1.remove(29) #移除不存在的项
登录后复制

输出:

set([1])
set([1, 2])
set([1])
set([1])
False

登录后复制

Traceback (most recent call last):
File "F:\Python\test.py", line 9, in
set1.remove(29) #移除不存在的项
KeyError: 29

4、frozenset

集合是可变的,所以不能用做字典的键。集合本身只能包含不可变值,所以也就不能包含其他集合:

set1=set([1])
set2=set([2])
set1.add(set2)
登录后复制

输出如下:

Traceback (most recent call last):
File "F:\Python\test.py", line 3, in
set1.add(set2)
TypeError: unhashable type: 'set'

可以使用frozenset类型用于代表不可变(可散列)的集合:

set1=set([1])
set2=set([2])
set1.add(frozenset(set2))
print set1
登录后复制

输出:

set([1, frozenset([2])])
登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

CentOS上PyTorch的GPU支持情况如何 CentOS上PyTorch的GPU支持情况如何 Apr 14, 2025 pm 06:48 PM

在CentOS系统上启用PyTorchGPU加速,需要安装CUDA、cuDNN以及PyTorch的GPU版本。以下步骤将引导您完成这一过程:CUDA和cuDNN安装确定CUDA版本兼容性:使用nvidia-smi命令查看您的NVIDIA显卡支持的CUDA版本。例如,您的MX450显卡可能支持CUDA11.1或更高版本。下载并安装CUDAToolkit:访问NVIDIACUDAToolkit官网,根据您显卡支持的最高CUDA版本下载并安装相应的版本。安装cuDNN库:前

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

docker原理详解 docker原理详解 Apr 14, 2025 pm 11:57 PM

Docker利用Linux内核特性,提供高效、隔离的应用运行环境。其工作原理如下:1. 镜像作为只读模板,包含运行应用所需的一切;2. 联合文件系统(UnionFS)层叠多个文件系统,只存储差异部分,节省空间并加快速度;3. 守护进程管理镜像和容器,客户端用于交互;4. Namespaces和cgroups实现容器隔离和资源限制;5. 多种网络模式支持容器互联。理解这些核心概念,才能更好地利用Docker。

minio安装centos兼容性 minio安装centos兼容性 Apr 14, 2025 pm 05:45 PM

MinIO对象存储:CentOS系统下的高性能部署MinIO是一款基于Go语言开发的高性能、分布式对象存储系统,与AmazonS3兼容。它支持多种客户端语言,包括Java、Python、JavaScript和Go。本文将简要介绍MinIO在CentOS系统上的安装和兼容性。CentOS版本兼容性MinIO已在多个CentOS版本上得到验证,包括但不限于:CentOS7.9:提供完整的安装指南,涵盖集群配置、环境准备、配置文件设置、磁盘分区以及MinI

CentOS上PyTorch的分布式训练如何操作 CentOS上PyTorch的分布式训练如何操作 Apr 14, 2025 pm 06:36 PM

在CentOS系统上进行PyTorch分布式训练,需要按照以下步骤操作:PyTorch安装:前提是CentOS系统已安装Python和pip。根据您的CUDA版本,从PyTorch官网获取合适的安装命令。对于仅需CPU的训练,可以使用以下命令:pipinstalltorchtorchvisiontorchaudio如需GPU支持,请确保已安装对应版本的CUDA和cuDNN,并使用相应的PyTorch版本进行安装。分布式环境配置:分布式训练通常需要多台机器或单机多GPU。所

CentOS上PyTorch版本怎么选 CentOS上PyTorch版本怎么选 Apr 14, 2025 pm 06:51 PM

在CentOS系统上安装PyTorch,需要仔细选择合适的版本,并考虑以下几个关键因素:一、系统环境兼容性:操作系统:建议使用CentOS7或更高版本。CUDA与cuDNN:PyTorch版本与CUDA版本密切相关。例如,PyTorch1.9.0需要CUDA11.1,而PyTorch2.0.1则需要CUDA11.3。cuDNN版本也必须与CUDA版本匹配。选择PyTorch版本前,务必确认已安装兼容的CUDA和cuDNN版本。Python版本:PyTorch官方支

centos如何安装nginx centos如何安装nginx Apr 14, 2025 pm 08:06 PM

CentOS 安装 Nginx 需要遵循以下步骤:安装依赖包,如开发工具、pcre-devel 和 openssl-devel。下载 Nginx 源码包,解压后编译安装,并指定安装路径为 /usr/local/nginx。创建 Nginx 用户和用户组,并设置权限。修改配置文件 nginx.conf,配置监听端口和域名/IP 地址。启动 Nginx 服务。需要注意常见的错误,如依赖问题、端口冲突和配置文件错误。性能优化需要根据具体情况调整,如开启缓存和调整 worker 进程数量。

See all articles