python具名元组(namedtuple)的具体使用

 更新时间:2023年03月21日 11:11:35   作者:alwaysrun  
本文主要介绍了python具名元组(namedtuple)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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)    

到此这篇关于python具名元组(namedtuple)的具体使用的文章就介绍到这了,更多相关python具名元组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用pytorch进行图像的顺序读取方法

    使用pytorch进行图像的顺序读取方法

    今天小编就为大家分享一篇使用pytorch进行图像的顺序读取方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python优雅处理日志记录的方法小结

    Python优雅处理日志记录的方法小结

    日志记录在软件开发中扮演着至关重要的角色,它不仅可以帮助开发人员跟踪应用程序的状态和行为,还能提供有价值的诊断信息,本文将深入探讨 Python 中优雅处理日志的方法,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-12-12
  • Python和C/C++交互的几种方法总结

    Python和C/C++交互的几种方法总结

    这篇文章主要给大家总结介绍了Python和C/C++交互的几种方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • 使用Python读写csv文件

    使用Python读写csv文件

    大家好,本篇文章主要讲的是使用Python读写csv文件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • python中使用百度音乐搜索的api下载指定歌曲的lrc歌词

    python中使用百度音乐搜索的api下载指定歌曲的lrc歌词

    这篇文章主要介绍了python中使用百度音乐搜索的api下载指定歌曲的lrc歌词,同时也分析出了歌曲的下载地址,需要的朋友可以参考下
    2014-07-07
  • pytorch 实现在预训练模型的 input上增减通道

    pytorch 实现在预训练模型的 input上增减通道

    今天小编就为大家分享一篇pytorch 实现在预训练模型的 input上增减通道,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python实现一个Git日志统计分析的小工具

    Python实现一个Git日志统计分析的小工具

    这篇文章主要给大家介绍了关于利用Python如何实现一个Git日志统计分析小工具的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • pandas如何快速去除列名中的特殊符号

    pandas如何快速去除列名中的特殊符号

    在使用Pandas处理数据时,经常需要处理数据中的列名column name,有时候,列名可能包含特殊字符,比如空格、点号、括号等,这些特殊字符可能会导致下一步的代码出错,因此需要将这些特殊字符从列名中删除,下面先介绍pandas如何去除列名中的特殊符号,感兴趣的朋友一起看看吧
    2024-01-01
  • python将三维数组展开成二维数组的实现

    python将三维数组展开成二维数组的实现

    今天小编就为大家分享一篇python将三维数组展开成二维数组的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python Pandas中数据的合并与分组聚合

    python Pandas中数据的合并与分组聚合

    大家好,本篇文章主要讲的是python Pandas中数据的合并与分组聚合,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论