• Python 学习 第12篇:命名元组


    Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值:

    collections.namedtuple(typename, field_names)

    返回一个命名元组类 typename,其中参数的意义如下:

    • typename:类名称
    • field_names: 元组中元素的名称

    一,定义命名元组类

    命名元组是一个类,有两种方式来定义命名元组:

    from collections import namedtuple
    
    User = namedtuple('User', ['name', 'age', 'id'])
    User = namedtuple('User', 'name age id')

    实例化命名元组,获得类的一个实例:

    user = User('tester', '22', '464643123')

    二,命名元组的属性和方法

    1,命名元组类的属性和方法

    • 类属性 _fields:包含这个类所有字段名的元组
    • 类方法 _make(iterable):接受一个可迭代对象来生产这个类的实例
    # 通过类方法 _make() 和一个list创建一个User对象
    user = User._make(['Runoob', 'male', 12])
    User._fields

    2,命名元组实例的方法

    • 实例方法 _asdict():把具名元组以 collections.OrdereDict 的形式返回,可以利用它来把元组里的信息友好的展示出来
    • 实例方法_replace():用于修改实例的属性
    # 获取实例的属性:
    print( user.name, user.sex, user.age)
    
    # 使用 _replace() 修改对象属性
    user = user._replace(age=22)# User(name='user1', sex='male', age=22)
    
    # 使用 _asdict()函数把 User对象转换成字典
    print( user._asdict() )
    # OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])

    三,把字典或列表转换为命名元组

    1,把字典转换为命名元组

    可以把Python的字典转换为命名元组:

    >>> dt={'name':'b', 'age':2, 'id':135}
    >>> ut=User(**dt)
    ## User(name='b', age=2, id=135)

    2,把列表转换为命名元组

    使用map函数,调用命名元组类的_make函数,把列表转换为命名元组的列表

    User = namedtuple('User', 'name age id')
    list_users=map(User._make,[('u1',23,1001),('u2',21,1002),('u3',25,1003),])

    3,把命名元组转换为列表

    也可以把命名元组转换为list,列表中只有值,而没有字段名称:

    >>> list(ut)
    ['b', '2', 135]

    四,访问命名元组

    通过逗号运算符和属性名来访问元组字段的值,例如,ut是命名元组的对象,name是对象的属性,可以通过以下方式访问元组的name属性:

    ut.name

    五,命名元组的用途

    命名元组在存储csv或者sqlite3返回数据的时候特别有用

    EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
    
    import csv
    for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
        print(emp.name, emp.title)
    
    import sqlite3
    conn = sqlite3.connect('/companydata')
    cursor = conn.cursor()
    cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
    for emp in map(EmployeeRecord._make, cursor.fetchall()):
        print(emp.name, emp.title)

    参考文档:

    Python namedtuple

    namedtuple工厂函数精讲

  • 相关阅读:
    数字形式转换
    货币转换
    温度转换
    volatile 的可见性,禁止指令重排序,无法保证原子性的理解
    mysql索引的结构的分析
    史上最详细的ORACLE19c安装说明
    Solaris 修改联网代理的设置
    Oracle Drop表并未直接删除 drop table xx purge
    oracle自定义函数创建函数索引
    连线法合并两个有序链表
  • 原文地址:https://www.cnblogs.com/ljhdo/p/10656314.html
Copyright © 2020-2023  润新知