本篇文章给大家带来的内容是关于Python中数据结构与算法的应用(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
问题1
现在有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?
解决方案
任何的序列(可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量。前提是变量的数量和序列元素的数量要一致。In [3]: p = (4,5)
In [4]: x,y = p
In [5]: x
Out[5]: 4
In [6]: y
Out[6]: 5
In [7]: data = ['ACME', 50, 91.1, (2012, 12, 21)]
In [8]: name, shares, price, date = data
In [9]: name
Out[9]: 'ACME'
In [10]: shares
Out[10]: 50
In [11]: date
Out[11]: (2012, 12, 21)
如果变量数量和序列元素数量不匹配,会产生一个异常。In [12]: p = (x,5)
In [13]: a,b,c = p
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in ()
----> 1 a,b,c = p
ValueError: not enough values to unpack (expected 3, got 2)
这种解压赋值可以用在任何可迭代对象中,不仅仅是列表或者元组,还包括字符串,文件对象,迭代器和生成器。In [14]: A = 'hello'
In [15]: a,b,c,d,e = A
In [16]: a
Out[16]: 'h'
In [17]: b
Out[17]: 'e'
In [18]: c
Out[18]: 'l'
In [19]: d
Out[19]: 'l'
In [20]: e
Out[20]: 'o'
In [21]: a,b,c,d,e
Out[21]: ('h', 'e', 'l', 'l', 'o')
对于只想解压序列其中一部分,丢弃其中一些值,只需要用一些不需要的变量名去占用掉相应位置的序列元素即可。In [22]: data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
In [23]: _, shares, price, _ = data
In [24]: shares
Out[24]: 50
In [25]: price
Out[25]: 91.1
问题2
如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError 。那么怎样才能从这个可迭代对象中解压出 N 个元素出来?
解决方案
Python的星号表达式可以解决这个问题。比如,你在学习一门课程,在学期末的时候,你想统计下家庭作业的平均成绩,但是排除掉第一个和最后一个分数。如果只有四个分数,你可能就直接去简单的手动赋值,但如果有 24 个呢?这时候星号表达式就派上用场了:
在函数的调用中,简单的通过变量名位置进行匹配,但是使用name=value的形式告诉Python依旧按照变量名进行匹配,这些叫做关键字参数。在调用中使用 *sequence 或者 **dict 允许我们在一个序列或者字典中相应的封装任意多的位置相关或者关键字的对象,并且在它们传递给函数的时候,将它们解包为分开的,单个的参数。In [26]: def drop_first_last(grades):
....: first,*middle,last = grades
....: return avg(middle)