Pythonのデータ構造(及びアルゴリズム分析)
1.1は、個々の可変配列に分解しました:
1.1.1ソリューション:
任意の配列が単純な割り当てのシーケンスを複数に分解することができ、唯一の要件は、構造体変数の総数はの配列と一致するようにすることである
。例:
tp = (1,1,2)
var1,var2,var3 = tp
print(var1,var2,var3)
data = ['hello','a','b','c','d']
var1,var2,var3,var4,var5 = data
print(var1,var2,var3,var4,var5)
#若变量个数和元素个不统一则会报错:
#ValueError:need more than 2 values to unpack / too many values to unpack
任意の長さの分解から1.2イテレート可能オブジェクト要素
1.2.1ソリューション:
ほとんどの牛のものよりもXのpython非常に柔軟な「* 表現」
の例:
num1,*kargs,num2 = [1,2,3,4,5,6]
print(num1)# 1
print(num2)# 2
print(*kargs)# [2,3,4,5]
avg = sum(*args)/len(*args)
print(avg)# 2+3+4+5 / 4 == 3.5
より複雑な例:
record = [
('foo',1,2),
('bar','hello'),
('foo',2,3),
('foo',4,4)
]
def do_foo(x,y):
print('foo',x,y)
def do_bars(s):
print('bar',s)
for tag,*args in record:
if tag == 'foo':
do_foo(*args)
elif tag == 'bar':
do_bars(*args)
#有些时候想要丢弃某些值:
record = ('白piao老师', 50, 123.45, (12, 9, 2012)]
name,*_,(*_,year) = record #常常使用_或者ign来表示丢弃值
print(name,year)
#输出结果: 小白piao老师 2012
#有的时候依托于*可以做出更加精妙的算法
#例子:
def func(items):
head_var, *tail_var = items
return var_head + func(tail_var) if tail_var else head_var
>>>func([1,2,3,4,5])
>>>15
#其实python做这个真心鸡肋....
最後のN個の要素の保存1.3:
私たちは、反復または最後の数レコードの限定された歴史的な記録を行うための処理の他の形をしたい場合:
1.3.1ソリューション
from collections import deque
def search(lines,pattern,history):
previous_lines = deque(maxlen = history)
for line in lines:
if pattern == line :
yield line,privious_lines
privious_lines.append(line)
if __name__ == '__main__':
with open('test.txt') as f:
for line,prevlines in search(f,'whitepiao',5):
for line1 in prevlines:
print(line1)
print(line,end = '')
print('-'*20)
両端キューについて1.3.2
実際には、キューの長さが固定されていてもよい、本質的に両端キュー、固定長ならば、キューが満杯である場合には、新たな価値が付加され、最も古い値が自動的に排出され、
>>>q = deque(maxlen = 3)
>>>q
>>>deque([],maxlen=3)
>>>q.append(1)
>>>q.append(2)
>>>q.append(3)
>>>q
>>>deque([1,2,3],maxlen = 3)
>>>q.append(4)
>>>q
>>>deque([2,3,4],maxlen = 3)
>>>q.appendleft(77)
>>>q
>>>deque([77,2,3],maxlen = 3)
1.4 Nの要素の最大値または最小値を見つけます。
コレクション内のN個の要素の最大値または最小値を見つける1.4.1
1.4.2ソリューション:
import heapq as h
nums = [1,8, 2, 23, -4, 18, 23, 42, 37, 2]
print(h.nlargest(3,nums))# [42,37,23]
print(h.nsmallest(3,nums)# [-4,1,2]
その他のパラメータのキーを受け入れることができnlargestとnsmallestを使用しました。
proInfo = [
{'name':'IB','shares':100,'prices':91.1},
{'name':'APP','shares':99,'prices':107.2},
{'name':'LEN','shares':80,'prices':99.0},
{'name':'ASU','shares':80,'prices':91.0},
{'name':'DEL','shares':95,'prices':89.7},
]
cheap = h.nsmallest(3,proInfo,lambda x:x['price'])
expensive = h.nlargest(3,proInfo,lambda x:x['price'])
>>>cheap
>>>[89.7,91.0,91.1]