重要知识点

  • 生成式(推导式)的用法

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

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

  • 嵌套的列表的坑

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

    Python Tutor - VISUALIZE CODE AND GET LIVE HELP

  • heapq模块(堆排序)

    1. """
    2. 从列表中找出最大的或最小的N个元素
    3. 堆结构(大根堆/小根堆)
    4. """
    5. import heapq
    6. list1 = [34, 25, 12, 99, 87, 63, 58, 78, 88, 92]
    7. list2 = [
    8. {'name': 'IBM', 'shares': 100, 'price': 91.1},
    9. {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    10. {'name': 'FB', 'shares': 200, 'price': 21.09},
    11. {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    12. {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    13. {'name': 'ACME', 'shares': 75, 'price': 115.65}
    14. ]
    15. print(heapq.nlargest(3, list1))
    16. print(heapq.nsmallest(3, list1))
    17. print(heapq.nlargest(2, list2, key=lambda x: x['price']))
    18. print(heapq.nlargest(2, list2, key=lambda x: x['shares']))
  • itertools模块

    1. """
    2. 迭代工具模块
    3. """
    4. import itertools
    5. # 产生ABCD的全排列
    6. itertools.permutations('ABCD')
    7. # 产生ABCDE的五选三组合
    8. itertools.combinations('ABCDE', 3)
    9. # 产生ABCD和123的笛卡尔积
    10. itertools.product('ABCD', '123')
    11. # 产生ABC的无限循环序列
    12. itertools.cycle(('A', 'B', 'C'))
  • collections模块

    常用的工具类:

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