请选择 进入手机版 | 继续访问电脑版

湖南新梦想

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 11|回复: 0

用这10个小技巧加速Python编程(三)

[复制链接]

280

主题

281

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
发表于 2021-1-13 11:05:11 | 显示全部楼层 |阅读模式
本帖最后由 chaomeili 于 2021-1-13 11:06 编辑

9.按不同的订单要求排序   
    在许多项目中,对列表中的项目进行排序是一项普遍的任务。最基本的排序基于数字或字母顺序,我们可以使用内置sorted()函数。默认情况下,该sorted()函数将按升序对列表进行排序(实际上,它可以是可迭代的)。如果将reverse参数指定为True,则可以按降序获得项目。一些简单的用法如下所示。

  >>> # A list of numbers and strings
  ... numbers = [1, 3, 7, 2, 5, 4]
  ... words = ['yay', 'bill', 'zen', 'del']
  ... # Sort them
  ... print(sorted(numbers))
  ... print(sorted(words))
  ...
  [1, 2, 3, 4, 5, 7]
  ['bill', 'del', 'yay', 'zen']
  >>> # Sort them in descending order
  ... print(sorted(numbers, reverse=True))
  ... print(sorted(words, reverse=True))
  ...
  [7, 5, 4, 3, 2, 1]
  ['zen', 'yay', 'del', 'bill']

  除了这些基本用法外,我们还可以指定key参数,以便可以对复杂项进行排序,例如元组列表。考虑这种情况的以下示例。

  >>> # Create a list of tuples
  ... grades = [('John', 95), ('Aaron', 99), ('Zack', 97), ('Don', 92), ('Jennifer', 100), ('Abby', 94), ('Zoe', 99), ('Dee', 93)]
  >>> # Sort by the grades, descending
  ... sorted(grades, key=lambda x: x[1], reverse=True)
  [('Jennifer', 100), ('Aaron', 99), ('Zoe', 99), ('Zack', 97), ('John', 95), ('Abby', 94), ('Dee', 93), ('Don', 92)]
  >>> # Sort by the name's initial letter, ascending
  ... sorted(grades, key=lambda x: x[0][0])
  [('Aaron', 99), ('Abby', 94), ('Don', 92), ('Dee', 93), ('John', 95), ('Jennifer', 100), ('Zack', 97), ('Zoe', 99)]
  
     上面的代码通过利用传递给key参数的lambda函数,向我们展示了两个高级排序的示例。第一个使用降序对项目进行排序,第二个使用默认的升序对项目进行排序。我们要结合这两个要求,如果考虑使用该reverse参数,则可能会得到一个错误的排序树,因为如果尝试按多个条件进行排序,则反向参数将适用于所有参数。请参见下面的代码段。

  >>> # Requirement: sort by name initial ascending, and by grades, descending
  ... # Both won't work
  ... sorted(grades, key=lambda x: (x[0][0], x[1]), reverse=True)
  [('Zoe', 99), ('Zack', 97), ('Jennifer', 100), ('John', 95), ('Dee', 93), ('Don', 92), ('Aaron', 99), ('Abby', 94)]
  >>> sorted(grades, key=lambda x: (x[0][0], x[1]), reverse=False)
  [('Abby', 94), ('Aaron', 99), ('Don', 92), ('Dee', 93), ('John', 95), ('Jennifer', 100), ('Zack', 97), ('Zoe', 99)]
  >>> # This will do the trick
  ... sorted(grades, key=lambda x: (x[0][0], -x[1]))
  [('Aaron', 99), ('Abby', 94), ('Dee', 93), ('Don', 92), ('Jennifer', 100), ('John', 95), ('Zoe', 99), ('Zack', 97)]

  如您所见,通过将reverse参数设置为True或False,都无效。取而代之的是,技巧是取反分数,因此,当您按默认的升序排序时,由于这些值的取反,分数将反向排序。但是,此方法有一个警告,因为取反只能用于数字值,而不能用于字符串。

10.不要忘记defaultdict
  字典是一种有效的数据类型,它使我们能够以键值对的形式存储数据。它要求所有键都是可哈希的,存储这些数据可能涉及哈希表的使用。这种方法允许以O(1)效率实现数据检索和插入。但是,应注意,除了内置的dict类型外,我们还有其他可用的字典。其中,我想讨论defaultdict类型。与内置dict类型不同,defaultdict允许我们设置默认工厂函数,该工厂函数在键不存在时创建元素。

  >>> student = {'name': "John", 'age': 18}
  ... student['gender']
  ...
  Traceback (most recent call last):
    File "<input>", line 2, in <module>
  KeyError: 'gender'
  
     假设我们正在处理单词,并且想要将与列表相同的字符分组,并且这些列表与作为键的字符相关联。这是使用内置dict类型的幼稚实现。值得注意的是,检查dict对象是否具有letter键是至关重要的,因为如果键不存在,则调用该append()方法会引发KeyError异常。

  >>> letters = ["a", "a", "c", "d", "d", "c", "a", "b"]
  ... final_dict = {}
  ... for letter in letters:
  ...     if letter not in final_dict:
  ...         final_dict[letter] = []
  ...     final_dict[letter].append(letter)
  ...
  ... print("Final Dict:", final_dict)
  ...
  Final Dict: {'a': ['a', 'a', 'a'], 'c': ['c', 'c'], 'd': ['d', 'd'], 'b': ['b']}

  让我们看看如何使用defaultdict编写更简洁的代码。尽管该示例很简单,但是它只是为我们提供了有关defaultdict类的一些想法,这使我们不必处理字典对象中不存在的键。

  >>> from collections import defaultdict
  ...
  ... final_defaultdict = defaultdict(list)
  ... for letter in letters:
  ...     final_defaultdict[letter].append(letter)
  ...
  ... print("Final Default Dict:", final_defaultdict)
  ...
  Final Default Dict: defaultdict(<class 'list'>, {'a': ['a', 'a', 'a'], 'c': ['c', 'c'], 'd': ['d', 'd'], 'b': ['b']})

  结论
  在阅读本文之前,我们可能已经了解了一些技巧,但是希望仍然对这些技巧有所了解。在项目中实践这些惯用用法将使您的Python代码更具可读性和性能。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|湖南新梦想 ( 湘ICP备18019834号-2 )

GMT+8, 2021-1-21 16:31 , Processed in 0.044307 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表