python字典split_Python进阶讲解:namedtuple和split()

1.namedtuplePython中的元组(tuple)是大家非常熟悉的类型,它可以存储一个Python对象序列,不过元组与列表有所不同,元组中的元素值是不能被更改的。

由于元组不像字典那样可以为内部的元素命名,因此我们并不知道元组内的元素所表达的意

义,在访问元组的时候也只能通过索引访问其中的元素。 于是Python标准库collections

引入了namedtuple函数,它可以创建一个和元组类似但更为强大的类型——具名元组

(namedtuple),也就是构造一个带字段名的元组。

collections.namedtuple(typename,field_names,*,verbose = False,rename= False,module = None )

其中:

typename:实际上就是你通过namedtuple创建的一个元组的子类的类名,通过这样的方式我们可以初始化各种各样的实例化元组对象。

field_names:类似于字典的key,在这里定义的元组可以通过这样的key去获取里面对应索引位置的元素值,这样的key可以是列表,也可以是用空格、/和逗号这样的分隔符隔开的字符串。

rename:如果rename指定为True,那么你的field_names里面不能包含有非Python标识符,Python中的关键字以及重复的name,如果有,它会默认给你重命成‘_index’的样式,这个index表示该name在field_names中的索引,例:['abc', 'def', 'ghi', 'abc'] 将被转换成['abc', '_1', 'ghi', '_3']。

其他俩个不常用,需要的可以查看Python官网教程collections-集装箱数据类型​docs.python.org

>>>from collections import namedtuple

>>>Point = namedtuple('Point', ['x', 'y'])

>>>p = Point(11, y=22) # 可以使用关键字参数和位置参数初始化namedtuple

>>> p[0] + p[1] # 可以使用索引去获取namedtuple里面的元素

33

>>> x, y = p # 可以将namedtuple拆包

>>> x, y

(11, 22)

>>> p.x + p.y # 使用对应的字段名字也可以获取namedtuple里面的元素

33

>>> p # 使用类似name=value的样式增加了数据的可读性

Point(x=11, y=22)

除了从元组继承的方法外,命名元组还支持三个附加方法和两个属性。为避免与字段名称冲突,方法和属性名称以下划线开头。

classmethod somenamedtuple._make(可迭代)

从现有序列中创建新实例或可迭代的类方法。

>>> t = [11, 22]

>>> Point._make(t)

Point(x=11, y=22)

somenamedtuple._asdict()

返回一个新值

>>> p = Point(x=11, y=22)

>>> p._asdict()

OrderedDict([('x', 11), ('y', 22)])

somenamedtuple._replace(** kwargs)

返回命名元组的新实例,用新值替换指定字段:

>>> p = Point(x=11, y=22)

>>> p._replace(x=33)

Point(x=33, y=22)

>>> for partnum, record in inventory.items():

... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())

somenamedtuple._source

具有纯Python源代码的字符串,用于创建命名的tuple类。源使命名的元组自记录。可以打印,使用执行exec()或将其保存到文件中并导入。

somenamedtuple._fields

列出字段名称的字符串元组。对于自省和从现有命名元组创建新的命名元组类型很有用。

# 可以通过这个属性获取namedtuple对象当前的所有字段名field_names

>>> p._fields # 获取 field_names,注意是元组形式

('x', 'y')

>>> Color = namedtuple('Color', 'red green blue')

>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)

>>> Pixel(11, 22, 128, 255, 0)

Pixel(x=11, y=22, red=128, green=255, blue=0)

# 还可以通过getattr来获取字段名是字符串的元素的值value

>>> getattr(p, 'x')

11

# 把字典通过拆包的形式转换成namedtuple

>>> d = {'x': 11, 'y': 22}

>>> Point(**d)

Point(x=11, y=22)

# 还可以通过自定义namedtuple子类方法实现一些计算的功能和格式化输出的功能

>>> class Point(namedtuple('Point', ['x', 'y'])):

... __slots__ = ()

... @property

... def hypot(self):

... return (self.x ** 2 + self.y ** 2) ** 0.5

... def __str__(self):

... return 'Point: x=%6.3fy=%6.3fhypot=%6.3f' % (self.x, self.y, self.hypot)

>>> for p in Point(3, 4), Point(14, 5/7):

... print(p)

Point: x= 3.000 y= 4.000 hypot= 5.000

Point: x=14.000 y= 0.714 hypot=14.018

# 一般给namedtuple添加新的字段我们通过_fields就可以快速完成,而无法通过定义子类方法来完成

>>> Point3D = namedtuple('Point3D', Point._fields + ('z',))

# 我们可以通过给namedtuple的__doc__属性赋值来修改或添加相应的文档描述

>>> Book = namedtuple('Book', ['id', 'title', 'authors'])

>>> Book.__doc__ += ': Hardcover book in active collection'

>>> Book.id.__doc__ = '13-digit ISBN'

>>> Book.title.__doc__ = 'Title of first printing'

>>> Book.authors.__doc__ = 'List of authors sorted by last name'

2.split()——拆分字符串

通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)

str.split(str="",num=string.count(str))[n]

参数说明:

str:表示为分隔符,默认为空格,但是不能为空('')。若字符串中没有分隔符,则把整个字符串作为列表的一个元素。例如:s.split('')是不合法的表达

num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量

[n]:表示选取第n个分片当使用空格作为分隔符时,对于中间为空的项会自动忽略

split()当不带参数时以空格进行分割(不管几个空格全部砍掉),当代参数时,以该参数进行分割。

>>> str = 'hello world'

>>> print(str.split( ))

['hello', 'world']

>>>

1.以'.'为分隔符

>>> str = 'hello.world'

>>> print(str.split('.'))

['hello', 'world']

>>>

2.分割一次

>>> str = 'hello python language'

>>> print(str.split(' ', 1))

['hello', 'python language']

>>>

3.分割两次,取第一个分片(序号为0)

>>> str = 'hello python language'

>>> str.split(' ', 2)[0]

'hello'

>>>

4.分割两次,并把分割后的三个部分保存到三个变量中

>>> str = 'hello python language'

>>> s1, s2, s3=str.split(' ', 2)

>>> s1

'hello'

>>> s2

'python'

>>> s3

'language'

>>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值