Day16.几个常用的排序库

几个常用的排序库



前言

在Python中其实有蛮多好用的排序库,但是自己却很少见的,当然了,由于自己能力有限,先简单介绍一点简单的库嘛。生成式是我们在写代码时,为了美观以及代码的高效性,经常使用的一个Python进阶的知识,而这其中经常会出现一些(有毒的)坑,毕竟像我这种刚从基础过来的小白,刚看到这种东西,一下子还是思路跟不上的。


一. 生成式(推导式)

1.1 简单用法

prices = {
  'AAPL': 191.88,
  'GOOG': 1186.96,
  'IBM': 149.24,
  'ORCL': 48.44,
  'ACN': 166.89,
  'FB': 208.09,
  'SYMC': 21.29
}
# 用股票价格大于100元的股票构造一个新的字典
prices2 = {key: value for key, value in prices.items() if value > 100}
print(prices2)

注: 生成式(推导式)可以用来生成列表、集合和字典。

1.2 嵌套列表的套路(坑)

names = ['关羽', '张飞', '赵云', '马超', '黄忠']
courses = ['语文', '数学', '英语']
# 录入五个学生三门课程的成绩
# 错误 - 参考http://pythontutor.com/visualize.html#mode=edit
# scores = [[None] * len(courses)] * len(names)
scores = [[None] * len(courses) for _ in range(len(names))]
for row, name in enumerate(names):
    for col, course in enumerate(courses):
        scores[row][col] = float(input(f'请输入{name}的{course}成绩: '))
        print(scores)

二. 相关模块使用

2.1 heapq模块-堆排序

"""
从列表中找出最大的或最小的N个元素
堆结构(大根堆/小根堆)
"""
import heapq

list1 = [34, 25, 12, 99, 87, 63, 58, 78, 88, 92]
list2 = [
  {'name': 'IBM', 'shares': 100, 'price': 91.1},
  {'name': 'AAPL', 'shares': 50, 'price': 543.22},
  {'name': 'FB', 'shares': 200, 'price': 21.09},
  {'name': 'HPQ', 'shares': 35, 'price': 31.75},
  {'name': 'YHOO', 'shares': 45, 'price': 16.35},
  {'name': 'ACME', 'shares': 75, 'price': 115.65}
]
print(heapq.nlargest(3, list1))  # 最大的三个
print(heapq.nsmallest(3, list1))  # 最小的三个
# 以 price 为关键字,选取最大的两个
print(heapq.nlargest(2, list2, key=lambda x: x['price']))  
# 以 shares 为关键字,选取最大的两个
print(heapq.nlargest(2, list2, key=lambda x: x['shares']))

2.2 itertools模块-迭代

"""
迭代工具模块
"""
import itertools

# 产生ABCD的全排列
print(itertools.permutations('ABCD'))
# 产生ABCDE的五选三组合
print(itertools.combinations('ABCDE', 3))
# 产生ABCD和123的笛卡尔积
print(itertools.product('ABCD', '123'))
# 产生ABC的无限循环序列
print(itertools.cycle(('A', 'B', 'C')))

2.3 collections模块

其他的工具类:

  1. namedtuple:命令元组,它是一个类工厂,接受类型的名称和属性列表来创建一个类。
  2. deque:双端队列,是列表的替代实现。Python中的列表底层是基于数组来实现的,而deque底层是双向链表,因此当你需要在头尾添加和删除元素是,deque会表现出更好的性能,渐近时间复杂度为 O ( 1 ) O(1) O(1)
  3. Counterdict的子类,键是元素,值是元素的计数,它的most_common()方法可以帮助我们获取出现频率最高的元素。Counterdict的继承关系我认为是值得商榷的,按照CARP原则,Counterdict的关系应该设计为关联关系更为合理。
  4. OrderedDictdict的子类,它记录了键值对插入的顺序,看起来既有字典的行为,也有链表的行为。
  5. defaultdict:类似于字典类型,但是可以通过默认的工厂函数来获得键对应的默认值,相比字典中的setdefault()方法,这种做法更加高效。
"""
找出序列中出现次数最多的元素
"""
from collections import Counter

words = [
  'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
  'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around',
  'the', 'eyes', "don't", 'look', 'around', 'the', 'eyes',
  'look', 'into', 'my', 'eyes', "you're", 'under'
]
counter = Counter(words)
print(counter.most_common(3))

总结

今天主要学了两个方面,一个是关于生成式的简单用法以及出现一些复杂的生成式时会出现的坑。然后就是开始接触简单的算法了,这里有几个常见的关于排序的库(毕竟小白开始接触关于算法的最好的内容就是排序了)。上面的内容只能说是自己勉强看懂吧,继续加油,像大佬们看齐。

溜了遛了,脑壳疼。(16/100)。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值