Python零基础入门-5 数据结构(列表和元组

简介: Python零基础入门-5 数据结构(列表和元组

数据结构

简单介绍Python中常用的几种数据结构。

1. 列表 list

列表类似于其它编程语言里的可变数组。

标准库参考:列表是可变序列,通常用于存放同类项目。

1.1 列表的创建

  • 使用方括号创建空列表:[]
  • 使用方括号,里面的项用,隔开:[a,b,c]
  • 使用列表推导式:[x for x in iterable]
  • 使用构造器: list()或list(iterable)

构造器会返回一个列表,其中的项与iterable中的项值和顺序都相同。iterable是一个可迭代对象。

1.2 列表的操作

列表是可变序列,因此它支持通用序列操作可变序列操作

通用序列操作:支持判断,求值等操作,但不可修改序列内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVKDDZoD-1654953870678)(file://D:\笔记\笔记\日常记录\2022\python_pytorch\个人笔记\Python零基础\assets\2022-05-21-10-04-09-image.png?msec=1654953864040)]

可变序列操作:

除了通用序列操作,还支持对序列元素赋值、删除等操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XY3jbzxq-1654953870680)(file://D:\笔记\笔记\日常记录\2022\python_pytorch\个人笔记\Python零基础\assets\2022-05-21-10-04-48-image.png?msec=1654953864039)]

列表额外方法

``sort(*, key=None, reverse=False)

就地排序列表中的元素。key是有一个参数的函数,用来生成用于比较的键;reverse是True或False,表示是否反转。*用来限定后面的参数仅能通过关键字方式传递。

lst1 = [1,2,3,7,3,4]
lst1.sort()
print(lst1)

key参数很适合用lambda表达式:

scores = [('a', 99), ('b', 66), ('c', 77), ('d', 88)]
scores.sort(key=lambda x: -x[1])
print(scores)

使用列表实现堆栈、队列

堆栈是一种后进先出的数据结构。可以将堆栈想象成一口井。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JDwWIdTK-1654953870681)(file://D:\笔记\笔记\日常记录\2022\python_pytorch\个人笔记\Python零基础\assets\2022-05-21-10-27-30-image.png?msec=1654953864030)]

(堆栈:进的顺序是1,2,3,4。出的顺序是4,3,2,1。)

使用列表实现堆栈非常容易,用append()模拟进栈,pop()模拟出栈。

stack = [1, 2, 3]
stack.append(4)
stack.append(5)
print(stack)

stack.pop()
print(stack)

stack.pop()
stack.pop()

print(stack)


2. 元组

元组是不可变序列,通常用于存储多项集。或用于需要数据不可变的情况(如存储到set中)。

2.1 元组的创建

可以用多种方式构建元组:

  • 使用一对圆括号来表示空元组: ()
  • 使用一个后缀的逗号来表示单元组: a,(a,)
  • 使用以逗号分隔的多个项: a, b, c or (a, b, c)
  • 使用内置的 tuple(): tuple()tuple(iterable)

请注意决定生成元组的其实是逗号而不是圆括号。 圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。 例如,f(a, b, c) 是在调用函数时附带三个参数,而 f((a, b, c)) 则是在调用函数时附带一个三元组。

2.2 元组的操作

元组是不可变序列,实现了所有通用序列的操作。

2.3 扩展内容:命名元组

通过名称访问相比通过索引访问清晰collections.namedtuple() 提供了命名元组的方法。

collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

返回一个新的元组子类,名为 typename 。这个新的子类用于创建类元组的对象,可以通过字段名来获取属性值,同样也可以通过索引和迭代获取值。

子类实例同样有文档字符串(类名和字段名)。另外一个有用的 __repr__() 方法,以 name=value 格式列明了元组内容。

field_names 是一个像 [‘x’, ‘y’] 一样的字符串序列。 field_names 也可以是一个纯字符串,用空白或逗号分隔开元素名,比如 'x y' 或者 'x, y'

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y']) #namedtuple('Point', 'x, y')
p = Point(1, 2)
print(p[0] + p[1])
print(p.x + p.y)

命名元组尤其有用于赋值 csv sqlite3 模块返回的元组

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
    print(emp.name, emp.title)

除了继承元组的方法,命名元组还支持三个额外的方法和两个属性。为了防止字段名冲突,方法和属性以下划线开始。

三个方法

classmethod somenamedtuple._make(iterable)

类方法从存在的序列或迭代实例创建一个新实例。

t = [11, 22]
Point._make(t)


somenamedtuple._asdict()

返回一个新的 dict ,它将字段名称映射到它们对应的值:

p = Point(x=11, y=22)
p._asdict()
#{'x': 11, 'y': 22}

somenamedtuple._replace(**kwargs)

返回一个新的命名元组实例,并将指定域替换为新的值

p = Point(x=11, y=22)
p._replace(x=33)

两个属性

somenamedtuple._fields

字符串元组列出了字段名。用于提醒和从现有元组创建一个新的命名元组类型。

p._fields            # view the field names


Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)
Pixel(11, 22, 128, 255, 0)

somenamedtuple._field_defaults

字典将字段名称映射到默认值。

Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
Account._field_defaults
# {'balance': 0}
Account('premium')
# Account(type='premium', balance=0)

要获取这个名字域的值,使用 getattr() 函数 :

getattr(p, 'x')

转换一个字典到命名元组,使用 ** 两星操作符

d = {'x': 11, 'y': 22}
Point(**d)

命名元组是一个正常的Python类,它可以很容易的通过子类更改功能。

class Point(namedtuple('Point', ['x', 'y'])):
    __slots__ = ()
    @property
    def hypot(self):
        return (self.x ** 2 + self.y ** 2) ** 0.5
    def __str__(self):
        return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

for p in Point(3, 4), Point(14, 5/7):
    print(p)

通过直接赋值给 __doc__ 属性,更改文档字符串

Book = namedtuple('Book', ['id', 'title', 'authors'])
Book.__doc__ += ': Hardcover book in active collection'
Book.id.__doc__ = '13-digit ISBN'
Book.title.__doc__ = 'Title of first printing'
Book.authors.__doc__ = 'List of authors sorted by last name'

相关文章
|
4天前
|
索引 Python
Python的列表操作有哪些?
Python的列表操作非常丰富,包括列表的创建、元素的访问、修改、添加、删除、切片、排序等多个方面。
24 12
|
7天前
|
算法 程序员 图形学
脑洞大开!Python并查集:用最简单的方式,解决最复杂的数据结构问题!
【7月更文挑战第17天】并查集,数据结构明星,处理不相交集合合并与查询。Python实现核心操作:查找与合并。路径压缩优化查找,按秩合并保持平衡。实战应用如图连通性判断,算法竞赛利器。掌握并查集,解锁复杂问题简单解法,照亮编程之旅!
24 10
|
1天前
|
Python
|
1天前
|
索引 Python
python的数据结构
【7月更文挑战第23天】
14 5
|
4天前
|
索引 Python
|
6天前
|
Python
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
【7月更文挑战第18天】并查集,数据结构超级英雄,用于不相交集合的合并与查询。Python实现包括初始化、查找根节点和合并操作。应用广泛,如社交网络分析、图论问题、集合划分等。示例代码展示了解决岛屿数量问题,统计连通的“1”单元格数。掌握并查集,提升编程效率,解决复杂问题。
24 6
|
6天前
|
存储 Python
震惊!Python并查集:解锁数据结构新姿势,让你从菜鸟秒变大神!
【7月更文挑战第18天】并查集,一种处理不相交集合的树形数据结构,支持Union(合并)和Find(查询)操作。Python实现中,用字典存储元素及其父节点,初始时每个元素为根。通过路径压缩提高效率。应用包括网络连通性判断、动态连通性检测和集合操作。掌握并查集,提升编程技能,解决复杂问题。开始探索,成为数据结构大师!
|
6天前
|
Python
逆天改命!掌握Python并查集,数据结构难题从此不再是你的痛!
【7月更文挑战第18天】并查集,一种神器数据结构,用于处理不相交集合合并与查询,解决网络连通性等难题。Python实现常通过记录元素父节点
18 4
|
4天前
|
存储 算法 Python
Python数据结构新视角:Trie树与Suffix Tree的相爱相杀,你站哪边?
【7月更文挑战第20天】在编程领域,Trie树(前缀树)与Suffix Tree(后缀树)犹如双星,各有专长。Trie树高效检索字符串集合,擅长前缀匹配,适用于自动补全和拼写检查;Suffix Tree则管理字符串所有后缀,加速子串查询,解最长公共前缀和重复子串难题。两者在不同场景发光发热,Trie树于快速响应的自动完成胜出,Suffix Tree则在基因序列分析和文本模式识别中独领风骚。抉择之间,应用场景与需求成关键,恰如剑客选剑,唯理解本质方能制胜。
|
6天前
|
Python
【Azure Function】发布 Python Function 到 Azure 成功,但是无法显示Function列表
"module not found" error: "Failure Exception: ImportError: libpq.so.5: cannot open shared object file: No such file or directory. Cannot find module."