python具名元组(namedtuple)的具体使用
作者:alwaysrun 发布时间:2021-08-02 18:10:38
collections.namedtuple用于构造带字段名的元组。对应类型为typing.NamedTuple(可用作超类)。
具名元组
namedtuple对象的定义:
collections.namedtuple(typename, field_names, verbose=False, rename=False, defaults=None, module=None):
typename:元组名称
field_names:是字段序列(如,[‘x’, ‘y’]);
rename:为true时,字段名无效时(如,重名或使用关键字)会被自动替换为位置名(如,_1);
defaults:字段的默认值,若为iterable对象,则依次对应field_names中字段的缺省值;
from collections import namedtuple
Color = namedtuple("Color", "r g b alpha")
def convert_to_color(desc: str, alpha: float = 0.0):
if desc == "green":
return Color(r=50, g=205, b=50, alpha=alpha)
elif desc == "blue":
return Color(r=50, g=0, b=255, alpha=alpha)
else:
return Color(r=50, g=0, b=0, alpha=alpha)
从可迭代对象(Iterable)构造具名元组:
c = Color._make([10, 20, 30, 0.1])
nc = Color._make((10, 20, 30, 0.1))
print("r:", c.r)
元组操作
具名元组修改:不能直接修改里面的值,可通过_replace构造一个新的:
c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5}
nc = c._replace(r=100)
把字典转换为具名元组:
c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5}
nc = Color(**c)
具名元组转换为字典(通过_asdict方法):
c = Color(r=50, g=0, b=0, alpha=0.5)
d = c._asdict()
具名元组转换为元组:
c = Color(r=50, g=0, b=0, alpha=0.5)
t = tuple(c)
属性
属性_fields包含所有字段的元组:如('r', 'g', 'b', 'alpha');
属性__annotations__包含字段与对应类型的字典:如{'r': <class 'float'>, 'g': <class 'float'>, 'b': <class 'float'>, 'alpha': <class 'float'>};
属性_field_defaults保证有初始值的字段与初始值的字典:如{'alpha': 0.0};
排序
具名元组排序:通过operator库中的attrgetter可指定排序字段:
from operator import attrgetter
colors = [
Color(r=50, g=205, b=50, alpha=0.1),
Color(r=50, g=205, b=50, alpha=0.5),
Color(r=50, g=0, b=0, alpha=0.3)
]
out = sorted(colors, key=attrgetter("alpha"))
print(out)
与字典比较
字典dict是一种非常通用的数据结构,很容易被滥用,同时相对namedtuple,有以下问题:
字典是不可散列,因此无法将其存储在set或其他字典中;
字典是可变的,可以根据需要添加任意数量的新键;
与dict类似,在namedtuple中可以将值分配给单个变量并根据需要使用。但:
namedtuple是不可变的,不会意外添加新的值(键);
数据类
数据类详情可参见《数据类(dataclass)简介》。
dataclass修饰
python3.7中引入了数据类(Data Class),可看做是“具有默认值的可变namedtuple”:
可方便地添加doc;
可定义可选字段;
from dataclasses import dataclass
# frozen设为true后,字段内容将不允许修改(与namedtuple完全类似)
# 否则可修改字段;并可任意添加字段(如,c.n=1);
@dataclass(frozen=True)
class DColor:
"""A regular class that represents a color."""
r: float
g: float
b: float
alpha: float = 0.0
# c = DColor(r=10, g=20, b=30)
c = DColor(10, 20, 30)
继承NamedTuple
通过继承NamedTuple也可方便定义(同时可定义字段的初始值,有初始值的字段必须在无初始字段后面):
from typing import NamedTuple
class NColor(NamedTuple):
"""A namedtuple that represents a color."""
r: float
g: float
b: float
alpha: float = 0.0
nc = NColor(100, 110, 120)
来源:https://blog.csdn.net/alwaysrun/article/details/129648509


猜你喜欢
- Pytest和Unittest测试框架的区别?如何区分这两者,很简单unittest作为官方的测试框架,在测试方面更加基础,并且可以再次基础
- 笔主在做一个项目要生成一组随机有序的整型数字,并按行输出到文本文件使用,恰好开始学习Python3,遂决定直接使用Python3解决思路:与
- 前言setTimeout,前端工程师必定会打交道的一个函数。它看上去非常的简单,朴实,有着一个很不平凡的名字--定时器。其实网上关于Java
- 有这样一个要求,它要创建一个SQL Server查询,其中包括基于事件时刻的累计值。典型的例子就是一个银行账户,因为你每一次都是在不同的时间
- 注意:index.html再次声明变量的时候注意空格的问题来源:https://blog.csdn.net/guofeng93/articl
- drop table if exists dd; create table dd ( user_id int , class_no int
- 前言在vue项目中我们经常使用到 v-show ,v-if,v-for等内置的指令,除此之外vue还提供了非常方便的自定义指令,供我们对普通
- Matplotlib是一个很好的作图软件,但是python下默认不支持中文,所以需要做一些修改,方法如下:1.在python安装目录的Lib
- 这个网页颜色表是很好用,鼠标点击颜色即可复制颜色值到剪贴板,方便大家设计取色。下载苏昱css2 样式表中文手册包括颜色表:W3C- 十六色色
- 方法一使用findspark使用pip安装findspark:pip install findspark在py文件中引入findspark:
- Fabric是一个用Python开发的部署工具,最大特点是不用登录远程服务器,在本地运行远程命令,几行Python脚本就可以轻松部署。文档入
- 将数据库中的信息存储至XML文件中:save.asp<!-- #include file="adovbs
- 协程协程(co-routine,又称微线程)是一种多方协同的工作方式。当前执行者在某个时刻主动让出(yield)控制流,并记住自身当前的状态
- 一、安装selenium库问题1:什么是selenium模块?基于浏览器自动化的一个模块。 问题2:selenium模块有什么作用
- python3标准库里自带线程池ThreadPoolExecutor和进程池ProcessPoolExecutor。如果你用的是python
- 用python输出汉字字库问题1:假设我们知道汉字编码范围是0x4E00到0x9FA5,怎么从十六进制的编码转成人类可读的字呢?问题2:怎么
- 利用oracle的dbms_random包结合rownum来实现,示例如下,随机取499户: select * from ( select
- 本段源码可以学习的地方:1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时构建;2. 可以重写一些魔术方法,比如 __new
- 准备工作右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库,import nu
- pycharm安装cv2模块安装失败和无法使用的解决步骤一我们先到这个网址:cv2下载地址去下载与自己python版本号和电脑位数对应的op