这篇文章主要介绍“python具名元组怎么使用”,在日常操作中,相信很多人在python具名元组怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python具名元组怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
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是不可变的,不会意外添加新的值(键);
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也可方便定义(同时可定义字段的初始值,有初始值的字段必须在无初始字段后面):
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具名元组怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。