美文网首页
Python3 - 映射名称到序列元素(命名元组)

Python3 - 映射名称到序列元素(命名元组)

作者: 惑也 | 来源:发表于2018-12-16 23:21 被阅读34次

问题

通过下标访问列表或元组中的元素,代码可读性不强,可以通过名称来访问元素。

解决方案

collections.namedtuple() 函数是继承自tuple的子类。可以创建自定义元素个数的tuple对象,它具备tuple的不变性,又可以根据属性而不是索引来引用其中的元素。代码示例:

from collections import namedtuple

User = namedtuple('User', ['mail_add', 'joined_date'])
print(User)
<class '__main__.User'>

user = User('python@gmail.com', '2017-11-10')
print(user)
print(user.mail_add)
print(user.joined_date)

User(mail_add='python@gmail.com', joined_date='2017-11-10')
python@gmail.com
2017-11-10

尽管 namedtuple 的实例看起来像一个普通的类实例,但是它跟元组类型是可交换的,支持所有的普通元组操作,如索引和解压。 比如:

print(len(user))
mail, joined = user
print(mail)
print(joined)

2
python@gmail.com
2017-11-10

命名元组的主要用途是将代码从下标操作中解脱出来。 因此,如果在数据库调用中返回了一个很大的元组列表,通过下标去操作其中的元素, 当数据库表中添加了新的列时,代码可能就会出错,但如果使用了命名元组,就不会有这样的顾虑。

为了说明清楚,下面是使用普通元组的代码:

def cumputer_cost(records):
    total = 0.0
    for record in records:
        total += record[1] * record[2]
    return total

下标操作通常会让代码表意不清晰,并且非常依赖记录的结构。 下面是使用命名元组的版本:

from collections import namedtuple

Stock = namedtuple('Stock', ['name', 'shares', 'price'])
def cumputer_cost(records):
    total = 0.0
    for record in records:
        r = Stock(*record)
        total += s.shares * s.price
    return total

讨论

命名元组另一个用途是作为字典的替代,因为字典存储需要更多的内存空间。 如果需要构建一个非常大的包含字典的数据结构,那么使用命名元组会更加高效。 但是需要注意的是,不像字典那样,一个命名元组是不可更改的。比如:

s = Stock('ACME', 100, 123.45)
s.shares = 75

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
    s.shares = 75
AttributeError: can't set attribute

如果确实需要改变属性的值,可以使用命名元组实例的 _replace() 方法, 它会创建一个全新的命名元组,并将对应的字段用新的值取代。比如:

s = Stock('ACME', 100, 123.45)
s = s._replace(shares=75)
print(s)

Stock(name='ACME', shares=75, price=123.45)

最后要说的是,如果目标是定义一个需要更新很多实例属性的高效数据结构,那么命名元组并不是最佳选择。 这时候应该考虑定义一个包含 slots 方法的类。

相关文章

  • Python3 - 映射名称到序列元素(命名元组)

    问题 通过下标访问列表或元组中的元素,代码可读性不强,可以通过名称来访问元素。 解决方案 collections....

  • 【Python进阶】1.18 映射名称到序列元素 collect

    1.18 映射名称到序列元素 问题 你有一段通过下标访问列表或者元组中元素的代码,但是这样有时候会使得你的代码难以...

  • Python 映射名称到序列元素

    映射名称到序列元素 一般访问列表或者元组的元素的时候,可能有限考虑的是通过下标索引进行访问,但是有些时候,这种情况...

  • Python快速精通2 - 序列,字典代码部分

    Python3基础2:序列(列表,元组)与字典 (一)序列通用方法 序列封包 本质上: 变量 < - - 元组看下...

  • 2-2 3 4 命名、统计、字典

    如何为元组中的每个元素命名,提高程序的可读性 如何统计序列中元素出现的频度 某随机序列中,找出出现次数最高的三个元...

  • python元组、字典和集合

    python元组 不可变序列,元组内元素值不能更改 创建元组空元组与多元素元组 my_tuple = ()或my_...

  • py_08_元组相关操作和方法(count index)

    元组和namedtuple命令元组 列表属于可变序列,可以任意修改列表中的元素。元组属于不可变序列,不能修改元组中...

  • 4、Python对象——元组(Tuple)

    序列(sequence)的一种 元组元素不能修改 元组的元素使用小括号括起来“()” 元组元素之间用逗号“,”隔开...

  • 元组

    1.元组的定义 Tuple(元组)与列表类似,不同之处在于元组的元素不能修改 元组 表示多个元素组成的序列 元组 ...

  • python-元组的使用

    元组的定义Tuple(元组)与列表类似,不同之处在于元组的 元素不能修改元组 表示多个元素组成的序列元组 在 Py...

网友评论

      本文标题:Python3 - 映射名称到序列元素(命名元组)

      本文链接:https://www.haomeiwen.com/subject/awkfkqtx.html