16 个有用的 Python 单行代码来简化常见任务

想编写简洁又高效的 Python 代码吗?这里有一份实用的 Python 单行代码清单,可以帮助你轻松完成一些常见任务。

如果你是 Python 初学者,你可能会花费不少时间学习基本的数据结构,比如列表和字符串。其实,对这些数据结构的一些操作完全可以使用简洁的单行代码来实现。

作为一名程序员,代码的可读性和可维护性应该优先于代码的长度。 然而,Python 语言的特性使得我们很容易写出既符合良好编码实践又足够精简的单行代码。

本文将重点介绍 Python 中处理简单列表和字符串的单行代码技巧。

让我们开始吧!

生成数字序列

生成数字序列最直接的方法是利用 range() 函数。 range() 函数会返回一个范围对象,你可以将其转换为列表。 例如,range(num) 会生成一个从 0 开始,到 num-1 结束的数字序列。

>>> nums = list(range(10))
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

想深入了解 range() 函数?不妨查阅相关资料。

range() 函数还允许你指定一个可选的步长值。所以,range(start, end, step) 会生成一个从 start 开始,以 step 为步长递增的序列,直到最后一个值小于 end

找出列表中的最大值和最小值

你可以使用内置的 max()min() 函数来分别找出列表中的最大值和最小值。

>>> min_elt, max_elt = min(nums), max(nums)
>>> min_elt
0
>>> max_elt
9

📑 关于多重赋值的说明

注意,我们可以在一个赋值语句中同时为 min_eltmax_elt 赋值。Python 支持这种多重赋值,这在解包可迭代对象并同时为多个变量赋值时非常有用。

移除列表中的重复元素

另一个常见的操作是从 Python 列表中移除重复的元素。 当你只需要唯一的值时,这个操作就很有必要。 最简单的方法是将列表转换为集合。

集合是一种内置的数据结构,它只包含唯一的、可哈希的元素。

>>> nums1 = [2,4,7,9,7,10]

nums1 中,元素 7 出现了两次。将其转换为集合会移除重复项 (这里的 7),只留下唯一的值。

由于我们仍然需要列表形式,我们会将集合转换回列表。这个操作可以通过以下单行代码完成:

>>> nums1 = list(set(nums1))
>>> nums1
[2, 4, 7, 9, 10]

📒 如果你想了解更多从 Python 列表中移除重复项的方法,请查阅相关指南。

统计列表中元素的出现次数

要统计一个元素在列表中出现的次数,可以使用内置的 count() 方法。list.count(elt) 返回 elt 在列表中出现的次数。

>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

在这个例子中,7nums 列表中出现了一次,因此 count() 方法会返回 1。

>>> nums.count(7)
1

检查列表中所有元素是否满足条件

要检查列表中所有元素是否都满足某个条件,可以使用 Python 内置的 all() 函数。

all() 函数接收一个可迭代对象作为参数,如果可迭代对象中所有元素的计算结果都为 True,则返回 True

在这里,我们要检查 nums2 列表中的所有元素是否都是奇数。

>>> nums2 = [3,4,7,11,21,67,12]

我们可以使用列表推导式来创建一个布尔值列表,并将其传递给 all() 函数。

在这个例子中,对于偶数元素 412num%2!=0 会返回 False。因此,列表推导式创建的布尔值列表会包含 False,而 all(list) 也会返回 False

>>> all([num%2!=0 for num in nums2])
False

💡 需要注意的是 all([]) (对空可迭代对象使用 all()) 返回 True

检查列表中是否有任何元素满足条件

要检查列表中是否有任何元素满足某个条件,可以使用 any() 函数。 如果至少有一个元素的计算结果为 True,则 any(some-list) 返回 True

>>> nums2 = [3,4,7,11,21,67,12]

和前面的例子一样,我们使用列表推导式来获取一个布尔值列表。 nums 列表中包含偶数,所以 any() 函数返回 True

>>> any([num%2 for num in nums2])
True

反转字符串

在 Python 中,字符串是不可变的。所以,当你想要反转一个字符串时,你只能得到一个反转后的字符串副本。 有两种常见的方法,都可以用 Python 的单行代码实现,一种是利用字符串切片,另一种是利用内置函数。

使用字符串切片

当切片的步长值为负数时,它会返回从末尾开始的字符串切片。 语法是 string[start:stop:step]。 那么,如果将步长值设置为 -1 并忽略起始和终止索引,会返回什么呢?

它会返回字符串的副本,从字符串的末尾开始,包含每一个字符。

>>> str1[::-1]
'olleh'

使用 reversed() 函数

内置的 reversed() 函数返回一个序列的反向迭代器。

>>> reversed(str1)
<reversed object at 0x008BAF70>
>>> for char in str1:
...     print(char)
...
h
e
l
l
o

你可以将它与 join() 方法结合使用,像这样:

>>> ''.join(reversed(str1))
'olleh'

将字符串转换为字符列表

假设我们想将一个字符串拆分为一个字符列表。 我们可以使用列表推导式来实现。

>>> str1 = 'hello'

列表推导式是 Python 中最强大的单行代码特性之一。

📒 想深入了解 Python 中的列表推导式吗? 请查阅相关资料。

我们遍历字符串并收集每个字符。

>>> chars = [char for char in str1]
>>> chars
['h', 'e', 'l', 'l', 'o']

若要将较长的字符串按照空格拆分成字符串列表,可以使用 split() 方法。

>>> str2 = 'hello world'
>>> str2.split()
['hello', 'world']

我们已经学习了如何使用列表推导式将字符串拆分为字符列表。 在上面的示例中,我们通过遍历字符串收集了所有字符。

现在,我们如果想遍历字符串并只收集数字,应该怎么做呢?

  • 我们可以在列表推导式中使用 isdigit() 方法来设置过滤条件。
  • 如果 c 是数字,c.isdigit() 返回 True,否则返回 False
>>> str3 = 'python3'
>>> digits = [c for c in str3 if c.isdigit()]
>>> digits
['3']

检查字符串是否以特定子字符串开头

要检查字符串是否以特定子字符串开头,可以使用 startswith() 字符串方法。 如果 str1 以该子字符串开头,则 str1.startswith(substring) 返回 True。 否则,返回 False

这里有一些例子:

>>> str4 = 'coding'
>>> str4.startswith('co')
True
>>> str5 = 'python'
>>> str5.startswith('co')
False

检查字符串是否以特定子字符串结尾

你可能已经猜到了,要检查字符串是否以给定的子字符串结尾,可以使用 endswith() 方法。

>>> str5 = 'python'
>>> str5.endswith('on')
True

我们也可以在列表推导式中使用字符串方法来获取一个布尔值列表 ends_with

>>> strs = ['python','neon','nano','silicon']
>>> ends_with = [str.endswith('on') for str in strs]
>>> ends_with
[True, True, False, True]

将列表的元素连接成字符串

我们已经了解了如何将字符串拆分为字符列表。 现在,我们如何进行将列表元素连接成字符串的逆操作呢?

为此,可以使用 join() 字符串方法,其语法为 separator.join(some-list)

我们只想将列表中的元素组合成一个字符串,不需要任何分隔符。 所以,我们将分隔符设置为空字符串。

>>> list_1 = ['p','y','t','h','o','n','3']
>>> ''.join(list_1)
'python3'

创建 Python 字典

就像列表推导式可以帮助我们从现有的可迭代对象构建新列表一样,字典推导式可以帮助我们从现有的可迭代对象构建新的字典。

Python 字典推导式是一种强大的单行代码,它可以动态地帮助我们创建字典。

在这里,我们有一个字符串列表 names

>>> names = ['Joe','Amy','Jake','Florence']

我们创建一个名为 names_d 的字典,其中字符串作为键,字符串的长度作为值。

>>> names_d = {name:len(name) for name in names}
>>> names_d
{'Joe': 3, 'Amy': 3, 'Jake': 4, 'Florence': 8}

有条件地为变量赋值

有时,你可能需要根据特定条件为变量赋值。

例如,你可能会读取用户输入,比如一个人的年龄。 根据输入的值,你可以决定是否允许他们参加聚会。

要在 Python 中进行这种有条件的赋值,可以使用三元运算符,写成以下单行代码。

>>> age = 21
>>> allowed = True if age >= 18 else False
>>> allowed
True

🔖 想深入了解 Python 中的三元运算符吗?请查阅相关资料。

生成所有排列

排列是指一组元素所有可能的排列方式。 如果一个集合中有 n 个不同的元素,那么就有 n! 种排列它们的方式,也就是 n! 个排列。

我们使用以下的列表 letters

>>> letters = ['a','b','c']

你可以使用 itertools 模块中的 permutations 函数来生成给定可迭代对象的所有可能排列。

>>> letters_p = permutations(letters)
>>> letters_p
<itertools.permutations object at 0x0127AF50>

如上所示,使用 permutations(iterable) 会返回一个排列对象。我们可以使用 for 循环来遍历它:

>>> for p in letters_p:
...     print(p)
...
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

不过,我们可以将排列对象转换为列表,从而将其改写为单行表达式:

>>> letters_p = list(permutations(letters))
>>> letters_p
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]

在这个例子中,有三个不同的元素,所以有 3!=6 种可能的排列。

生成列表的子集

有时,你可能需要从列表或其他可迭代对象中构造特定大小的所有可能子集。 让我们使用列表 letters,并获取所有大小为 2 的子列表。

为此,我们可以使用 itertools 模块中的 combinations 函数,如下所示:

>>> from itertools import combinations
>>> letters_2 = list(combinations(letters,2))
>>> letters_2
[('a', 'b'), ('a', 'c'), ('b', 'c')]

结论

在本教程中,我们学习了如何使用一些实用的 Python 单行代码对列表和字符串执行常见操作。 我们还了解了诸如 Python 列表和字典推导式等单行代码特性,以及如何将它们与内置函数结合使用来完成特定任务。

接下来,可以看看这份适合初学者的 Python 项目列表。