python基础第一课(小白piao分享)

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 解决方案:

python最牛x之一的莫过于非常灵活的 " * 表达式 " 了
例如:

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做这个真心鸡肋....

1.3 保存最后N个元素:

如果我们希望在迭代或者其他形式的处理过程中对最后几项纪录做一个有限的历史记录统计:

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 关于deque

deque其实本质上是一个可以固定长度的队列,如果固定了长度,在队列已满的情况下,向其中添加新值,会自动弹出最老的值,

>>>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个元素

1.4.1 在某个集合中找到最大或者最小的N个元素

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都可以接受一个参数key:

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]
发布了17 篇原创文章 · 获赞 1 · 访问量 364

猜你喜欢

转载自blog.csdn.net/weixin_43520503/article/details/103639489