python求集合最大值最小值_【干货】python实用小技之数据结构
目录1.解压序列赋值给多个变量2.解压可迭代对象赋值给多个变量3.保留有限的历史记录4.怎样从一个集合中获得最大或者最小的 N 个元素列表?5.字典排序6.字典中的键映射多个值7.字典的运算(求最小值、最大值、排序等)本文大多数例子搬自 python cookbook 这里是对学习的一个总结和提炼ps:python版本为python31解压序列赋值给多个变量# 有一个包含 N 个元素的元...
目录
-
1.解压序列赋值给多个变量
-
2.解压可迭代对象赋值给多个变量
-
3.保留有限的历史记录
-
4.怎样从一个集合中获得最大或者最小的 N 个元素列表?
-
5.字典排序
-
6.字典中的键映射多个值
-
7.字典的运算(求最小值、最大值、排序等)
1
解压序列赋值给多个变量
# 有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?data = ['ACME', 50, 91.1, (2012, 12, 21)]# 任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量# 变量的数量必须跟序列元素的数量是一样的name, shares, prices, date = data
print(name, shares, prices, date, sep=" | ", end="\n")# 如果只需要一部分,可以给个占位变量如_, sha, pr, _ = data
print(sha,pr,sep=' | ')
运行结果:
ACME | 50 | 91.1 | (2012, 12, 21)50 | 91.1
2
解压可迭代对象赋值给多个变量
# 解压可迭代对象赋值给多个变量def drop_frist_last(grades):
frist, *middle, last = grades return sum(middle) / len(middle)
print(drop_frist_last([0, 60, 70, 80, 100]))# 有时候,你想解压一些元素后丢弃它们,可以使用 比如 _ 或者 ignrecord = ('ACME', 50, 123.45, (12, 18, 2012))
name,*_,(*_,year) = record
print(name,year)
运行结果:70.0ACME 2012
3
保留有限的历史记录
''' 使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候, 最老的元素会自动被移除掉 '''def search(lines, pattern, histroy=60):
previous_lines = deque(maxlen=histroy)
for line in lines:
if pattern in line:
yield line, previous_lines previous_lines.append(line) print(len(previous_lines))
for item in previous_lines: print(item)
if __name__ == "__main__":
with open(os.getcwd() + "/Lesson1.py") as f:
for line, prevlines in search(f, '50', 3): print("type prevlines =", type(prevlines)) for pline in prevlines: print('pline = ', pline, end='') print("type line =", type(line))
# print('line = ', line, end='')
print('-' * 20)
#
4、怎样从一个集合中获得最大或最小的N个元素列表
# 当集合是一个列表是nums = [3, 10, 5, 23, 7, -4, 18, 23, 42, 37, 2]# 如果是更负责的对象时候mydirt = [
运行结果
[42, 37, 23]
[-4, 2, 3]
[{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]
[{'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}]
ps:堆数据结构最重要的特征是 heap[0] 永远是最小的元素,另外 nlargest,nsmallest 适合查找的元素个数相对比较小的时候,如果你仅仅想查找唯一的最小或最大(N=1)的元素的话,那么使用 min() 和 max() 函数会更快些。类似的,如果 N 的大小和集合大小接近的时候,通常先排序这个集合然后再使用切片操作会更快点 ( sorted(items)[:N] 或者是 sorted(items)[-N:] )
5
字典排序
''' 你想创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序。'''from collections import OrderedDict d = OrderedDict() d['foo'] = 1
d['beer'] = 2
d['bar'] = 4
d['park'] = 3
for key in d: print(key, d[key]) 执行结果:
foo 1
beer 2
bar 4
park 3
6
字典中的键映射多个值
from collections import defaultdict df_d = defaultdict(list) df_d['a'].append(1) df_d['a'].append(2) df_d['b'].append(4) print(df_d) d2 = defaultdict(set) pairs = [('a', 1), ('a', 2), ('b', 4)]
for key, value in pairs: d2[key].add(value) print(d2) 运行结果:
defaultdict(<class 'list'>, {'a': [1, 2], 'b': [4]}) defaultdict(<class 'set'>, {'a': {1, 2}, 'b': {4}})
7、字典的运算(求最小值、最大值、排序等)
怎样在数据字典中执行一些计算操作(比如求最小值、最大值、排序等等)?
prices = {
'ACME': 45.23,
'AAPL': 612.78,
'IBM': 205.55,
'HPQ': 37.20,
'FB': 10.75
}
# 求最小值
# 方法 1,通过zip 函数创建的是一个只能访问一次的迭代,将键值反过来
print(min(zip(prices.values(), prices.keys())))
# 输出 (10.75, 'FB')
# 方法二 直接取values 获取最小值,不过你就不知道对于的key
print(min(prices.values()))
# 输出 10.75#
方法三
min_key = min(prices, key=lambda k: prices[k]) print(prices[min_key])
# 输出 FB
# 排序
prices_sorted = sorted(zip(prices.values(), prices.keys()))
print(prices_sorted)
# 输出 [(10.75, 'FB'), (37.2, 'HPQ'), (45.23, 'ACME'), (205.55, 'IBM'), (612.78, 'AAPL')]
END
罗曼老师微课《MySQL从入门到实战》上线啦!
让你能力提升的火爆课程!用吃一顿早餐的时间提升自己。快戳原文链接报名吧!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)