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'

相关文章
|
6天前
|
Python
在 Python 中,对列表进行排序有两种常用的方法
在 Python 中,对列表进行排序有两种常用的方法
|
1天前
|
Java C语言 Python
Python语言的列表推导式怎么写
Python语言的列表推导式怎么写
|
5天前
|
Python
Python列表推导式是一种简洁的创建新列表的方式,它允许你在一行代码中完成对数据的操作和转换
【6月更文挑战第19天】Python列表推导式是创建新列表的简洁语法,它在一行内处理数据。表达式如`[expr for item in iterable if cond]`,其中`expr`是对元素的操作,`item`来自`iterable`,`if cond`是可选过滤条件。例如,将数字列表平方:`[x**2 for x in numbers]`。嵌套列表推导处理复杂结构,如合并二维数组:`[[a+b for a,b in zip(row1, row2)] for row1, row2 in zip(matrix1, matrix2)]`。简洁但勿过度复杂化。
13 5
|
6天前
|
索引 Python
python 取列表偶数和奇数位置的值
python 取列表偶数和奇数位置的值
15 5
|
5天前
|
Python
在Python中,解包参数列表和Lambda表达式是两个不同的概念
【6月更文挑战第19天】在Python中,解包参数允许将序列元素作为单独参数传递给函数,如`greet(*names_and_ages)`。而Lambda表达式用于创建匿名函数,如`lambda x, y: x + y`。两者可结合使用,如`max(*numbers)`找列表最大值,但过度使用lambda可能降低代码可读性。
11 3
|
5天前
|
存储 缓存 调度
Python教程:一文了解10种数据结构在Python中的实现方法
数据结构是计算机科学中非常重要的概念,它用于组织和存储数据,使得数据可以高效地被访问和操作。在编程中,选择合适的数据结构对于解决问题和提高程序性能至关重要。
19 1
|
9天前
|
索引 Python 容器
【Python核心数据结构探秘】:元组与字典的完美协奏曲
【Python核心数据结构探秘】:元组与字典的完美协奏曲
|
10天前
数据结构——栈和队列
数据结构——栈和队列
10 1
|
4天前
|
C++
【洛谷 P1044】[NOIP2003 普及组] 栈 题解(递归+记忆化搜索)
**NOIP2003普及组栈问题**:给定操作数序列1到n,仅允许push(进栈)和pop(出栈)操作。目标是计算所有可能的输出序列总数。输入包含一个整数n(1≤n≤18)。示例输入3,输出5。当队列空时返回1,栈空则只能入栈,栈非空时可入栈或出栈。AC C++代码利用记忆化搜索求解。
6 1
|
6天前
|
算法
$停车场管理系统 栈与队列
$停车场管理系统 栈与队列
6 1