Python技巧之变长和定长序列拆分

 更新时间:2021年12月03日 09:18:35   作者:Orion's?Blog  
这篇文章主要给大家分享的是Python技巧之变长和定长序列拆分,Python中的任何序列(可迭代的对象)都可以通过赋值操作进行拆分,包括但不限于元组、列表、字符串、文件、迭代器、生成器等。想了解更多详细的小伙伴请参考下面文章内容
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

Python中的任何序列(可迭代的对象)都可以通过赋值操作进行拆分,包括但不限于元组、列表、字符串、文件、迭代器、生成器等。

1.元组拆分

元组拆分是最为常见的一种拆分,示例如下:

p = (4, 5)
x, y = p 
print(x, y) # 4 5

如果写成

x, y, z = p

那么就会抛出ValueError异常:not enough values to unpack (expected 3, got 2)”

如果写成

p = (4, 5, 6)
x, y = p

那么就会抛出ValueError异常: “ too many values to unpack (expected 2)”

2.字符串拆分

字符串的拆分示意如下:

s = 'Hello'
a, b, c, d, e = s
print(a) # H

3.拆分时丢弃值

如果在拆分时想丢弃某些特定的值,可以用一个用不到的变量名来作为丢弃值的名称(常选'_'做为变量名),如下所示:

s = 'Hello'
a, b, _, d, _ = s
print(a) # H

4.嵌套序列拆分

Python也提供简洁的对嵌套序列进行拆分的语法。如下所示我们对一个比较复杂的异质列表进行拆分:

data = ['zhy', 50, 123.0, (2000, 12, 21)]
name, shares, price, (year, month, day) = data
print(year) # 2000

如果你想完整地得到(2000, 12, 21)这个表示时间戳的元组,那么你就得这样写:

data = ['zhy', 50, 123.0, (2000, 12, 21)]
name, shares, price, date = data
print(date) # (2000, 12, 21)

5.从任意长度的可迭代对象中拆分

之前我们说过,如果我们想从可迭代对象中分解出N个元素,但如果这个可迭代对象长度超过N,则会抛出异常"too many values to unpack"。针对这个问题的解决方案是采用"*"表达式。
比如我们给定学生的分数,想去掉一个最高分和一个最低分,然后对剩下的学生求平均分,我们可以这样写:

def avg(data: list):
    return sum(data)/len(data)
# 去掉最高分,最低分然后做均分统计
def drop_first_last(grades):
    first, *middle, last = grades
    return avg(middle)
print(drop_first_last([1,2,3,4])) # 2.5

还有一种情况是有一些用户记录,记录由姓名+电子邮件+任意数量的电话号码组成,则我们可以这样分解用户记录:

record = ['zhy', 'zhy1056692290@qq.com', '773-556234', '774-223333']
name, email, *phone_numbers = record
print(phone_numbers) # ['773-556234', '774-223333']

事实上,如果电话号码为空也是合法的,此时phone_numbers为空列表。

record = ['zhy', 'zhy1056692290@qq.com']
name, email, *phone_numbers = record
print(phone_numbers) # []

还有一种使用情况则更为巧妙。如果我们需要遍历变长元组组成的列表,这些元组长度不一。那么此时*表达式可大大简化我们的代码。

records = [('foo', 1, 2), ('bar', 'hello'), ('foo', 3, 4)]
for tag, *args in records:
    if tag == 'bar':
        print(args)
# ['hello']

在对一些复杂的字符串进行拆分时,*表达式也显得特别有用。

line = "nobody:*:-2:-2:-2:Unprivileged User:/var/empty:/usr/bin/false"
uname, *fields, home_dir, sh = line.split(':')
print(home_dir) # /var/empty

*表达式也可以和我们前面说的嵌套拆分和变量丢弃一起结合使用。

record = ['ACME', 50, 123.45, (128, 18, 2012)]
name, *_, (*_, year) = record
print(year) # 2012

最后再介绍*表达式用于递归函数的一种黑魔法,比如与递归求和结合可以这样写:

items = [1, 10, 7, 4, 5, 9]
def sum(items):
    head, *tail = items
    return head + sum(tail) if tail else head
print(sum(items)) # 36

不过,Python由于自身递归栈的限制,并不擅长递归。我们最后一个递归的例子可以做为一种学术上的尝试,但不建议在实践中使用它。

到此这篇关于Python技巧之变长和定长序列拆分的文章就介绍到这了,更多相关Python变长和定长序列拆分内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Python实现剪刀石头布小游戏(与电脑对战)

    Python实现剪刀石头布小游戏(与电脑对战)

    这篇文章给大家分享Python基础实现与电脑对战的剪刀石头布小游戏,练习if while输入和输出,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-12-12
  • python turtle工具绘制四叶草的实例分享

    python turtle工具绘制四叶草的实例分享

    在本篇文章里小编给各位整理的是关于python turtle工具绘制四叶草的实例分享,有兴趣的朋友们可以跟着学习下。
    2020-02-02
  • 关于Django显示时间你应该知道的一些问题

    关于Django显示时间你应该知道的一些问题

    将Django项目部署到Linux系统上进行测试时,发现操作记录的时间与服务器的时间不一致,相差13个小时。这主要是因为时区的问题,下面这篇文章主要总结介绍了关于Django显示时间你应该知道的一些问题,需要的朋友可以参考下。
    2017-12-12
  • PID原理与python的简单实现和调参

    PID原理与python的简单实现和调参

    这篇文章主要介绍了PID原理与python的简单实现和调参文章围绕主题展开详细的内容介绍,具有一定的参考价值。感兴趣的小伙伴可以参考一下
    2022-08-08
  • Python中的元组介绍

    Python中的元组介绍

    今天小编就为大家分享一篇关于Python中的元组介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • python opencv鼠标画点之cv2.drawMarker()函数

    python opencv鼠标画点之cv2.drawMarker()函数

    这篇文章主要给大家介绍了关于python opencv鼠标画点之cv2.drawMarker()函数的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用opencv具有一定的参考下学习价值,需要的朋友可以参考下
    2021-10-10
  • Python中使用实现输出哈沙德数的多种方法小结

    Python中使用实现输出哈沙德数的多种方法小结

    哈沙德数(Harshad?Number),又称Niven数,是指一个自然数,它可以被它的各位数字之和整除,本文将探讨如何使用多种不同的方法来判断一个数字是否是哈沙德数,感兴趣的可以了解下
    2024-01-01
  • Python Paramiko模块的使用实际案例

    Python Paramiko模块的使用实际案例

    这篇文章主要介绍了Python Paramiko模块的使用实际案例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 利用Python自制网页并实现一键自动生成探索性数据分析报告

    利用Python自制网页并实现一键自动生成探索性数据分析报告

    这篇文章主要介绍了利用Python自制了网页并实现一键自动生成探索性数据分析报告,文章内容具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • python基础之Socket套接字详解

    python基础之Socket套接字详解

    这篇文章主要介绍了python基础之Socket套接字详解,文中有非常详细的代码示例,对正在学习python基础的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-04-04

最新评论

?


http://www.vxiaotou.com