Python技法-序列拆分详解

目录
  • 元组拆分
  • 字符串拆分
  • 拆分时丢弃值
  • 嵌套序列拆分
  • 从任意长度的可迭代对象中拆分
  • 参考文献
  • 总结

元组拆分

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

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)”

字符串拆分

字符串的拆分示意如下:

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

拆分时丢弃值

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

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

嵌套序列拆分

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)

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

之前我们说过,如果我们想从可迭代对象中分解出\(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由于自身递归栈的限制,并不擅长递归。我们最后一个递归的例子可以做为一种学术上的尝试,但不建议在实践中使用它。

参考文献

[1] Martelli A, Ravenscroft A, Ascher D. Python cookbook[M]. " O'Reilly Media, Inc.", 2005. 数学是符号的艺术,音乐是上界的语言。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Python序列的推导式实现代码

    推导式comprehensions(又称解析式),是Python的一种独有特性. 推导式是可以从一个数据序列构建另一个新的数据序列(的一种结构体). Python中共有三种推导,在Python2和3中都有支持: 列表推导式 字典推导式 集合推导式 1.列表推导式 作用:用一个表达式创建一个有规律的列表或控制一个有规律列表. 列表推导式又叫列表生成式. (1)快速体验 需求:创建一个0-10的列表. while循环实现 # 1. 准备一个空列表 list1 = [] # 2. 书写循环,依次追加数

  • Python实现字典序列ChainMap

    目录 前言 ChainMap 重排列 更新值 前言 容器数据类型包括数组list,字典dict以及元组tuple等.本篇,将详细介绍ChainMap字典序列的使用. ChainMap ChainMap类管理的是一个字典序列,并按其出现的顺序搜索以查找与键关联的值.ChainMap提供了一个很好的"上下文"容器,因此可以把它看成一个栈,栈增长时发生变更,栈收缩时这些变更被丢弃. 下面,我们来看看其基本的使用规则: import collections a = {"a"

  • Python中拆分字符串的操作方法

    使用字符串时,常见的操作之一是使用给定的分隔符将字符串拆分为子字符串数组.在本文中,我们将讨论如何在Python中拆分字符串. .split()方法 在Python中,字符串表示为不可变的str对象. str类带有许多字符串方法,允许您操作字符串. .split()方法返回由分隔符分隔的子字符串列表. 它采用以下语法: str.split(delim=None, maxsplit=-1) 分隔符可以是字符或字符序列,而不是正则表达式. 在下面的示例中,字符串s将使用逗号分隔,作为分隔符. s =

  • python 数据提取及拆分的实现代码

    K线数据提取 依据原有数据集格式,按要求生成新表: 1.每分钟的close数据的第一条.最后一条.最大值及最小值, 2.每分钟vol数据的增长量(每分钟vol的最后一条数据减第一条数据) 3.汇总这些信息生成一个新表 (字段名:['time','open','close','high','low','vol']) import pandas as pd import time start=time.time() df=pd.read_csv('data.csv') df=df.drop('id'

  • python利用openpyxl拆分多个工作表的工作簿的方法

    实现按目录拆分工作簿,源数据如下图 按目录拆分成N个文件. 上代码,没有找是否有整个sheet 复制的,先逐个cell复制解决问题.: # encoding: utf-8 """ @author: 陈年椰子 @contact: hndm@qq.com @version: 1.0 @file: Split_Xls.py @time: 2019/9/24 0028 15:04 说明 """ def Split_Xls(xls_file): from

  • Python序列化与反序列化相关知识总结

    Python序列化与反序列 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个 dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把 name 改成 'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收.如果没有把修改后的 'Bill' 存储到磁盘上,下次重新运行程序,变量又被初始化为 'Bob'. 我们把变量从内存中变成可存储或传输的过程称之为序列化,在 Python 中叫 pickling,在其他语言中也被

  • Python技法-序列拆分详解

    目录 元组拆分 字符串拆分 拆分时丢弃值 嵌套序列拆分 从任意长度的可迭代对象中拆分 参考文献 总结 元组拆分 元组拆分是最为常见的一种拆分,示例如下: 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

  • python 字段拆分详解

    按照固定的字符,拆分已有的字符串 split(sep, n, expand = False) :sep:用于分割的字符串 n:分割为多少列 expand:是否展开为数据框,默认值为False (expand为True,返回DataFrame.False,Series) from pandas import read_csv; df = read_csv('F://baiduNetdisk//pytorch//4//4.7//data.csv') df = df.astype(str) df3 =

  • python学习 流程控制语句详解

    ###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的运行方向 # Ture:表示非空的量(String,tuple元组 .list.set.dictonary),所有非零的数字 # False:0,None .空的量 #逻辑表达式 可以包含 逻辑运算符 and or not if: ##################################

  • Python字符串处理实例详解

    Python字符串处理实例详解 一.拆分含有多种分隔符的字符串 1.如何拆分含有多种分隔符的字符串 问题: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如: s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" 其中;,|,\t 都是分隔符号,如何处理? 方法一: 连续使用str.split()方法,每次处理一种分隔符号 s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz&q

  • Python 常用string函数详解

    字符串中字符大小写的变换 1. str.lower()   //小写 >>> 'SkatE'.lower() 'skate' 2. str.upper()   //大写 >>> 'SkatE'.upper() 'SKATE' 3. str.swapcase()  //大小写互换 >>> 'SkatE'.swapcase() 'sKATe' 4. str.title()   //首字母大写,其余的小写 >>> 'SkatE'.title

  • python 多进程队列数据处理详解

    我就废话不多说了,直接上代码吧! # -*- coding:utf8 -*- import paho.mqtt.client as mqtt from multiprocessing import Process, Queue import time, random, os import camera_person_num MQTTHOST = "172.19.4.4" MQTTPORT = 1883 mqttClient = mqtt.Client() q = Queue() # 连

  • python中random模块详解

    Python中的random模块用于生成随机数,它提供了很多函数.常用函数总结如下: 1. random.random() 用于生成一个0到1的随机浮点数: 0 <= n < 1.0 2. random.seed(n) 用于设定种子值,其中的n可以是任意数字.random.random() 生成随机数时,每一次生成的数都是随机的.但是,使用 random.seed(n) 设定好种子之后,在先调用seed(n)时,使用 random() 生成的随机数将会是同一个. 3. random.unifo

  • Python基础之数据结构详解

    一.列表 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来 示例: list01 = ['a','b','c'] 1.1 列表更新元素 一个列表是可以储存不同的类型的数据结构,并且修改的新元素也不一定需要和原来的元素类型一致,但是要注意的是,更新列表的索引必须是已存在的索引,不能对超出列表的索引更新元素 1.2 列表增加元素 增加元素的方法: 1.append方法:在列表的最后增加一个元素. list01 = ['a', 'b', 'c'] list01 .append('d') pr

  • Python实现堆排序案例详解

    Python实现堆排序 一.堆排序简介 堆排序(Heap Sort)是利用堆这种数据结构所设计的一种排序算法. 堆的结构是一棵完全二叉树的结构,并且满足堆积的性质:每个节点(叶节点除外)的值都大于等于(或都小于等于)它的子节点. 关于二叉树和完全二叉树的介绍可以参考:https://blog.csdn.net/weixin_43790276/article/details/104737870 堆排序先按从上到下.从左到右的顺序将待排序列表中的元素构造成一棵完全二叉树,然后对完全二叉树进行调整,使

  • Python基础 括号()[]{}的详解

    目录 1.python中的小括号() 2.python中的中括号[] 3.python大括号{}花括号 前言: Python主要有三种数据类型:字典.列表.元组.其分别由花括号,中括号,小括号表示. 如: 字典:dic={'a':12,'b':34} 列表:list=[1,2,3,4] 元组:tup=(1,2,3,4) python语言最常见的括号有三种,分别是∶小括号().中括号[]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python

随机推荐