Python Cookbook 之一 数据结构和算法(二): 从任意长度的可迭代对象中分解元素

欢迎大家扫码关注我的微信公众号:
数据之恋

从任意长度的可迭代对象中分解元素

  • 一、问题
  • 二、解决方案
    • 2.1 * 表达式在首位
    • 2.2 * 表达式在中间
    • 2.3 * 表达式在末位
  • 三、讨论

一、问题

需要从某个可迭代对象中分解出 N 个元素, 但是这个可迭代对象的长度可能超过 N, 这会导致出现 “分解值过多(too many values to unpack)” 的异常。

二、解决方案

Python 的 “* 表达式” 可以用来解决这个问题。 且它可以出现在任意位置。

2.1 * 表达式在首位

需求: 有一个未知长度的列表, 其内均为 int 型元素。 现需要求出最后一个元素之前的所有元素的平均值与最后一个元素的差值。
解决:

>>> *a, c = [1, 2, 3]
>>> b = sum(a) / len(a)
>>> b - c
-1.5

2.2 * 表达式在中间

需求:有一个未知长度的列表, 其内均为 int 型元素。 现需求出除第一个和最后一个元素之外其余所有元素的平均值。
解决:

>>> a, *b, c = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> sum(b) / len(b)
5.0

2.3 * 表达式在末位

需求: 有一个未知长度的列表, 其内第一个元素是学生姓名, 第二个元素是性别, 从第三个开始是他的考试成绩(不定长)。 现需要将该学生的所有成绩取出来。
解决:

>>> name, sex, *scores = ['Cybeyond', 'Male', 99, 100, 89, 92, 97]
>>> name
'Cybeyond'
>>> sex
'Male'
>>> scores
[99, 100, 89, 92, 97]

三、讨论

对于分解未知长度的可迭代对象, 利用 * 表达式使得开发者可以轻松地得到所关心的元素, 而不必在可迭代对象中做复杂花哨的操作。

*表达式在迭代一个变长的元组序列时尤其有用:

>>> lst = [('foo', 1, 2), ('bar', 'aa'), ('foo', 3, 4), ('bar', 'bb')]
>>>
>>> def do_foo(x, y):
...     print('foo', x, y)
... 
>>> 
>>> def do_bar(s):
...     print('bar', s)
... 
>>> 
>>> for tag, *args in lst:
...     if tag == 'foo':
...         do_foo(*args)
...     elif tag == 'bar':
...         do_bar(*args)
... 
foo 1 2
bar aa
foo 3 4
bar bb

当和某些特定的字符串处理操作相结合, 比如拆分操作时:

>>> url = 'https://127.0.0.1:8080/rest/get_data/?id=4&tag=cybeyond&name=xuan'
>>> _, tag_requirement, name_requirement = url.split('&')
>>> tag_requirement
'tag=cybeyond'
>>> name_requirement
'name=xuan'

可以使用几个常用来表示丢弃值的变量名来承接想要丢弃的值, 如 _ 或 ign(ignore):

>>> name, _, *scores = ['Cybeyond', 'Male', 99, 100, 89, 92, 97]
>>> name
'Cybeyond'
>>> scores
[99, 100, 89, 92, 97]

【注意】本篇博客中所写的全部内容只能在 Python 3 版本中成功运行, 在 Python 2 版本中将会报 SyntaxError: invalid syntax 异常!!!


http://www.niftyadmin.cn/n/732617.html

相关文章

Nginx 之一 服务器的安装部署(二): Nginx 服务的启停控制

欢迎大家扫码关注我的微信公众号: Nginx 服务器的安装部署(二)-目录一、Nginx 服务的信号控制1.1 获取 Nginx 服务主进程 PID1.2 Nginx 服务可接收的信号二、Nginx 服务的启动三、Nginx 服务的停止3.1 停止方式一:3.2 停止方式二…

Python Cookbook 之一 数据结构和算法(三): 保存最后 N 个元素

欢迎大家扫码关注我的微信公众号: 保存最后 N 个元素一、问题二、解决方案三、讨论一、问题 我们希望在迭代或是其他形式的处理过程中对最后几项记录做一个有限的历史记录统计。 二、解决方案 保存有限的历史记录可算是 collections.deque 的完美应用场景了。 …

kali 更新源_kali安装docker环境

最近因为要在kali上搭建一个文件上传测试平台,所以得安装一个docker环境。安装https协议、CA证书、dirmngrapt-get updateapt-get install -y apt-transport-https ca-certificatesapt-get install dirmngr2.添加GPG密钥并添加更新源curl -fsSL https://mirrors.tun…

Python Cookbook 之一 数据结构和算法(四): 找到最大或最小的 N 个元素

欢迎大家扫码关注我的微信公众号: 找到最大或最小的 N 个元素一、问题二、解决方案三、讨论一、问题 我们想在某个集合中找出最大或最小的 N 个元素。 二、解决方案 heapq 模块中有两个函数 —— nlargest() 和 nsmallest() —— 它们正是我们所需要的&#xff…

opencv和matlab图像处理的效率与效果_图像处理在工程中的应用

点击蓝字关注我们传感器图像处理在工程和科研中都具有广泛的应用,例如:图像处理是机器视觉的基础,能够提高人机交互的效率,扩宽机器人的使用范围;在科研方面,相关学者把图像处理与分子动力学相结合&#xf…

Python 之 Linux 系统中一句命令搭建下载服务器

欢迎大家扫码关注我的微信公众号: Linux 系统中一句命令搭建下载服务器一、概述二、Python 2.x 版本实现三、Python 3.x 版本实现四、访问的方法一、概述 在工作或生活中, 我们有时候需要传输文件。 实现这个功能的方式有很多, 我们可以使用…

python生成器实例_python生成器generator用法实例分析

本文实例讲述了python生成器generator用法。分享给大家供大家参考。具体如下: 使用yield,可以让函数生成一个结果序列,而不仅仅是一个值 例如: def countdown(n): print "counting down" while n>0: yield n #生成一…

python如何实现自动化运维_利用Python实现自动化运维新浪微博

题图:from Pexels 最近在研究用 Python 来制作各个类别的机器人,今天先来分享一个自动发布新浪微博的机器人。 一、基本思路 其实要实现一个简单的自动发布微博机器人还是不难的,只需要每天按时找好要发布的素材(一般就是爬虫了&a…