重要知识点

  • 生成式(推导式)的用法 ```python prices = { ‘AAPL’: 191.88, ‘GOOG’: 1186.96, ‘IBM’: 149.24, ‘ORCL’: 48.44, ‘ACN’: 166.89, ‘FB’: 208.09, ‘SYMC’: 21.29 }

prices2 = {key: value for key, value in prices.items() if value > 100} print(prices2)

输出

{‘AAPL’: 191.88, ‘GOOG’: 1186.96, ‘IBM’: 149.24, ‘ACN’: 166.89, ‘FB’: 208.09}

  1. > 说明:生成式(推导式)可以用来生成列表、集合和字典
  2. - 嵌套的列表的坑
  3. ```python
  4. names = ['关羽', '张飞', '赵云', '马超', '黄忠']
  5. courses = ['语文', '数学', '英语']
  6. # 录入五个学生三门课程的成绩
  7. # 错误 - 参考http://pythontutor.com/visualize.html#mode=edit
  8. # scores = [[None] * len(courses)] * len(names)
  9. scores = [[None] * len(courses) for _ in range(len(names))]
  10. for row, name in enumerate(names):
  11. for col, course in enumerate(courses):
  12. scores[row][col] = float(input(f'请输入{name}的{course}成绩: '))
  13. print(scores)
  • headq 模块(堆排序)
    • 关注 key= labmda 的写法 ```python “”” 从列表中找出最大的或最小的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)) print(heapq.nlargest(2, list2, key=lambda x: x[‘price’])) print(heapq.nlargest(2, list2, key=lambda x: x[‘shares’]))

  1. - `itertools` 模块
  2. - 官方文档 [https://docs.python.org/3/library/itertools.html](https://docs.python.org/3/library/itertools.html)
  3. ```python
  4. import itertools
  5. # 产生ABCD的全排列
  6. for i in itertools.permutations('ABCD'):
  7. print(i)
  8. # 产生ABCDE的五选三组合
  9. for i in itertools.combinations('ABCDE', 3):
  10. print(i)
  11. # 产生ABCD和123的笛卡尔积
  12. for i in itertools.product('ABCD', '123'):
  13. print(i)
  14. # 产生ABC的无限循环序列
  15. for i in itertools.cycle(('A', 'B', 'C')):
  16. print(i)
  • collection 模块

常用的工具类:

  • namedtuple 命令元组,是一个类工厂,接收类型的名称和属性列表来创建一个类
  • deque 双向队列,是列表的替代实现。Python中的列表底层是基于数组实现的,而deque底层是双向链表,一次当需要在头尾添加和删除元素时,deque会表现出很好的性能,渐进时间复杂度为【Python进阶】重要知识点&数据结构与算法 - 图1
  • Counterdict 的子类,键时元素,值时元素的基数,它的 most_common() 方法可以帮助我们获取出现频率做高的元素。 Counterdist 的继承关系是值得商榷的,按照CARP原则, Counterdict 的关系应该设计为关联关系更合理
  • OrderedDictdict 的子类,它记录了键值对插入的顺序,看起来既有字典的行为,也有链表的行为
  • defaultdict :类似于字典类型,但是可以通过默认的工厂函数来获得键对应的默认值,相比字典中的 setdefault() 方法,这种做法更加高效 ```python “”” 找出序列中出现次数最多的元素 “”” 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))

  1. <a name="Cil2u"></a>
  2. # 数据结构和算法
  3. - 排序算法(选择、冒泡和归并)和查找算法(顺序和折半)
  4. ```python
  5. def select_sort(items, comp=lambda x, y: x < y):
  6. """简单选择排序"""
  7. items = items[:]
  8. for i in range(len(items) - 1):
  9. min_index = i
  10. for j in range(i + 1, len(items)):
  11. if comp(items[j], items[min_index]):
  12. min_index = j
  13. items[i], items[min_index] = items[min_index], items[i]
  14. return items
  1. def bubble_sort(items, comp=lambda x, y: x > y):
  2. """冒泡排序"""
  3. items = items[:]
  4. for i in range(len(items) - 1):
  5. swapped = False
  6. for j in range(i, len(items) - 1 - i):
  7. if comp(items[j], items[j + 1]):
  8. items[j], items[j + 1] = items[j + 1], items[j]
  9. swapped = True
  10. if not swapped:
  11. break
  12. return items
  1. def bubble_sort(items, comp=lambda x, y: x < y):
  2. """搅拌排序(冒泡排序升级版)"""
  3. items = items[:]
  4. for i in range(len(items) - 1):
  5. swapped = False
  6. for j in range(i, len(items) - i - 1): # 正向:把当前循环最大的放到最后
  7. if comp(items[j], items[j+1]):
  8. items[j], items[j+1] = items[j+1], items[j]
  9. swapped = True
  10. if swapped:
  11. swapped = False
  12. for j in range(len(items) - 2 - i, i, -1): # 反向:把当前循环最小的放到最前
  13. if comp(items[j-1], items[j]):
  14. items[j], items[j-1] = items[j-1], items[j]
  15. swapped = True
  16. if not swapped:
  17. break
  18. return items
  1. def merge(items1, items2, comp=lambda x, y: x < y):
  2. """合并(将两个有序的列表合并成一个有序的列表)"""
  3. items = []
  4. index1, index2 = 0, 0
  5. while index1 < len(items1) and index2 < len(items2):
  6. if comp(items1[index1], items2[index2]):
  7. items.append(items1[index1])
  8. index1 += 1
  9. else:
  10. items.append(items2[index2])
  11. index2 += 1
  12. items += items1[index1:]
  13. items += items2[index2:]
  14. return items
  15. def merge_sort(items, comp=lambda x, y: x < y):
  16. return _merge_sort(list(items), comp)
  17. def _merge_sort(items, comp):
  18. """归并排序"""
  19. if len(items) < 2:
  20. return items
  21. mid = len(items) // 2
  22. left = _merge_sort(items[:mid], comp)
  23. right = _merge_sort(items[mid:], comp)
  24. return merge(left, right, comp)
  1. def seq_search(items, key):
  2. """顺序查找"""
  3. for index, item in enumerate(items):
  4. if item == key:
  5. return index
  6. return -1
  1. def bin_search(items, key):
  2. """折半查找"""
  3. start, end = 0, len(items) - 1
  4. while start <= end:
  5. mid = (start + end) // 2
  6. if key > items[mid]:
  7. start = mid + 1
  8. elif key < items[mid]:
  9. end = mid - 1
  10. else:
  11. return mid
  12. return -1