Python中的解包用法
Posted 软件开发技术爱好者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的解包用法相关的知识,希望对你有一定的参考价值。
Python中的解包用法
解包(unpacking:解包,拆包),基本意思将容器里面的元素逐个取出来使用。封包(packing:封包,打包)基本意思将多个元素合起来作为一个整体使用。
可迭代对象支持解包(unpacking)
可迭代对象如列表、元组、字典、集合、字符串、生成器等支持自动解包。可迭代对象直接赋值给多个变量,此时可迭代对象的各元素会被依次赋值给每个变量。
列表中有3个元素,那么刚好如果列表中有3个元素,那么刚好可以分配给3个变量。示例源码如下:
a, b, c = [1,2,3]
print(a) #输出:1
print(b) #输出:2
print(c) #输出:3
运行效果:
元组解包示例源码如下:
a, b, c =(10,20,30)
print(a) #输出:10
print(b) #输出:20
print(c) #输出:30
字符串解包示例源码如下:
a,b,c = 'xyz'
print(a) #输出:x
print(b) #输出:y
print(c) #输出:z
生成器表达式解包示例源码如下:
a,b,c = (x + 10 for x in range(3))
print(a) #输出:10
print(b) #输出:11
print(c) #输出:12
多变量赋值操作
多变量赋值操作,等号右边其实是一个元组对象。示例源码如下:
a, b, c = 10,20,30
print(a) #输出:10
print(b) #输出:20
print(c) #输出:30
交换两个变量
在Python 中,交换两个变量非常方便,本质上也是自动解包过程。示例源码如下:
a, b = 10, 20
a, b = b, a #交换两个变量值
print(a) #输出:20
print(b) #输出:10
“catch-all”名称变量
等号左边变量的个数不等于右边可迭代对象中元素的个数怎么办?
详见PEP 3132 https://peps.python.org/pep-3132/
变量面前有星号——“catch-all”名称变量可以获取多个数值,这个星号可以放在任意变量,每个变量都分配一个元素后,剩下的元素作为列表(list)都分配给这个带星号的变量。
示例源码如下:
a, *b, c = [1, 2, 3, 4, 5] #注意星号的使用与作用
print(a) #输出:1
print(b) #输出:[2,3,4]
print(c) #输出:5
x, *y, z =(11, 12, 13, 14) #注意的使用与作用
print(x) #输出:11
print(y) #输出:[12,13]
print(z) #输出:14
运行效果:
*单星号用于解包迭代,**双星号用于解包字典
可参见https://peps.python.org/pep-0448/ 此PEP提出了*可迭代解包操作符(iterable unpacking operator)和**字典解包操作符(dictionary unpacking operators)的扩展用法
PEP448建议扩展使用*可迭代解包运算符和**字典解包运算符,以允许在更多位置、任意次数和其他情况下进行解包。特别是在函数调用(function calls)、推导式(comprehensions)和生成器表达式(generator expressions)以及显示中。
【python推导式(comprehensions)https://blog.csdn.net/cnds123/article/details/117395558
生成器表达式(Generator expressions)https://blog.csdn.net/cnds123/article/details/116695925 】
使用星号(*)和双星号(**)用于解包的例子源码
print(*[1], *[2, 3, 4], 5) #输出:1 2 3 4 5
print(*range(4), 10,20) #输出:0 1 2 3 10 20
print([*range(4), 10,20]) #输出:[0, 1, 2, 3, 10, 20]
print(dict(**'a': 1,'b': 2 , c=3,**'d': 4)) #输出:'a': 1, 'b': 2, 'c': 3, 'd': 4
运行效果:
下面介绍函数调用时的星号*和 双星号**的使用情况
使用星号 * 解包一个可迭代对象作为函数的参数。字典对象,可以使用两个星号,解包之后将作为关键字参数传递给函数。
示例源码如下:
def func(a,b,c): #func 函数定义了三个位置参数 a,b,c
print(a,b,c)
func(1,2,3) #调用func函数,通常需要三个参数,输出:1 2 3
func(*[1,2,3]) #也可以用*符号传入包含有3个元素的可迭代对象,输出:1 2 3
func(*"abc") #用*符号传入包含有3个元素的可迭代对象,输出:a b c
func(*"a":10,"b":20,"c":30)#用*符号传入包含有3个元素的可迭代对象,输出:a b c
func(**"a":10,"b":20,"c":30)#用**符号传入包含有3个元素的可迭代对象,输出:10 20 30
func(a=10,b=20,c=30) #注意这句和上句效果
运行效果:
用双星号作用的对象是字典对象,解包成关键字参数 key=value 的格式。
多个值封包(packing)成一个元组
把多个值赋给一个变量时,Python会自动把多个值封包(packing)成一个元组,源码如下:
a = 1,2,3,4,5
print(a) #多个值封包成一个元组
运行效果:
参考
https://zhuanlan.zhihu.com/p/41968260
https://blog.51cto.com/u_15127595/3268947
熊猫数据框python中的解包列表[重复]
【中文标题】熊猫数据框python中的解包列表[重复]【英文标题】:unpack list in pandas dataframe python [duplicate] 【发布时间】:2018-11-13 14:38:53 【问题描述】:我有一个包含 a、b、c 列的数据框。并且 c 列具有列表数据类型的数据。所以我想将列表的每个元素展开/解包/分解为新行。
所以,我们的输入如下所示。
a b c
0 1 2 [1, 'k': 1, 2]
1 3 2 ['m': 2, 'k': 2, 2]
我们的输出应该如下所示。
a b c
0 1 2 1
1 1 2 'k': 1
2 1 2 2
3 3 2 'm': 2
4 3 2 'k': 2
5 3 2 2
Sp,你可以在输出中,列表的每个元素都在行中,其他列 a 和 b 值重复对应于列表元素
【问题讨论】:
这是一个骗子。你搜索过吗? @AntonvBR 什么是骗子? 列表可以有可变大小吗? @YakymPirozhenko ,我们可以创建新列 acc。到 c 列中列表的大小 @AntonvBR 谢谢!它奏效了 【参考方案1】:cmets 中链接的问题的解决方案已过时。这些天你可以:
df.explode('c')
【讨论】:
以上是关于Python中的解包用法的主要内容,如果未能解决你的问题,请参考以下文章