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),可看做是&ldquo;具有默认值的可变namedtuple&rdquo;:

  • 可方便地添加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

标签:python,具名元组
0
投稿

猜你喜欢

  • 用javascript实现select的美化

    2007-05-11 16:50:00
  • php设计模式之装饰模式应用案例详解

    2023-11-14 13:37:20
  • 《JavaScript语言精粹》

    2009-04-03 11:27:00
  • 如何配置一个稳定的SQL Server数据库

    2008-12-09 14:07:00
  • Asp教程:Response对象

    2007-10-01 18:08:00
  • asp 采集程序常用函数分析

    2011-03-16 11:03:00
  • php基础教程 php内置函数实例教程

    2023-11-14 18:28:45
  • Access数据库出现0x80004005问题的解决方法

    2008-11-28 14:25:00
  • mysql 5.5.8的几个注意事项

    2011-01-04 19:34:00
  • Python随机函数库random的使用方法详解

    2021-06-07 16:16:23
  • Golang 操作TSV文件的实战示例

    2023-07-18 06:46:01
  • 天极产品设计流程

    2007-10-11 18:47:00
  • Python Unittest自动化单元测试框架详解

    2023-09-13 23:13:56
  • 新 API 寻求让 JavaScript 操作本地文件

    2009-11-27 18:28:00
  • PHP实现生成Excel文件并导出的示例详解

    2023-05-28 13:11:18
  • 语义化提高页面质量

    2007-10-07 11:56:00
  • css清除浮动的最优方法

    2008-04-25 22:33:00
  • 利用python脚本如何简化jar操作命令

    2021-02-12 11:08:15
  • 详解Django模板层过滤器和继承的问题

    2023-02-08 06:28:04
  • django 邮件发送模块smtp使用详解

    2021-09-24 23:04:15
  • asp之家 网络编程 m.aspxhome.com