16个有用的Python一行代码,用于简化常见任务
想要编写优雅且Pythonic的代码吗?下面是一些有用的Python一行代码来执行简单任务的列表。
如果你是一个初学者的Python程序员,你将花时间了解基本的数据结构,如列表和字符串。对于这些数据结构的一些操作可以通过简洁的一行代码片段来实现。
作为一个程序员,你应该优先考虑可读性和可维护性,而不是让代码更短。但是Python很容易得出遵循良好编码习惯的一行代码。
在本文中,我们将重点介绍Python中用于简单列表和字符串处理任务的一行代码。
让我们开始吧!
生成一个数字列表
生成数字列表的最简单方法是使用range()
函数。 range()
函数返回一个范围对象,你可以将其转换为列表。使用range(num)
将获得序列0, 1, 2,.., num-1。
>>> nums = list(range(10))
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
关于使用
range()
函数的更多信息你还可以使用可选的步长值使用
range()
函数。因此,range (start, end, step)
将给出序列start, start + step, start + 2*step,依此类推。最后一个值将是start + k*step,其中(start + k*step) < end且(start + (k+1)*step) > end。
找到列表中的最大值和最小值
你可以使用内置的max和min函数分别计算列表中的最大和最小元素。
>>> min_elt, max_elt = min(nums), max(nums)
>>> min_elt
0
>>> max_elt
9
📑 关于多重赋值的说明
请注意,我们在一个单独的赋值语句中为
min_elt
和max_elt
分配了值。Python支持这种多重赋值。当解包可迭代对象并同时为多个变量赋值时,这可能是有帮助的。
从列表中删除重复项
另一个常见的操作是从Python列表中删除重复项。当你只需要处理唯一值时,这是必要的。最简单的方法是将列表转换为集合来实现。
集合是一种内置的数据结构,其元素都是唯一且可哈希的。
>>> nums1 = [2,4,7,9,7,10]
在nums1
中,元素7出现了两次。将其转换为集合将删除重复项(这里是7),使我们得到一个唯一值的列表。
因为我们仍然需要处理列表,所以我们将集合转换回列表。可以使用以下代码行完成此操作:
>>> nums1 = list(set(nums1))
>>> nums1
[2, 4, 7, 9, 10]
📒 要了解更多从Python列表中删除重复项的其他技术,请查看this guide。
计算列表中元素的出现次数
要计算列表中元素出现的次数,你可以使用内置的count()
方法。 list.count(elt)
返回list
中elt
出现的次数。
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
在这里,7在nums
列表中出现了一次,所以count()
方法返回1。
>>> nums.count(7)
1
检查列表中的所有元素是否满足条件
要检查列表中的所有元素是否满足条件,可以使用Python的内置all()
函数。
all()函数接受可迭代对象作为参数,如果可迭代对象中的所有元素都为True(或者为真值),则返回True。
在这里,我们想要检查nums2列表中的所有元素是否都是奇数。
>>> nums2 = [3,4,7,11,21,67,12]
我们可以使用列表推导式构造一个布尔值列表,并将该列表作为参数传递给all()函数。
在这里,对于元素4和12(即偶数),num%2!=0将为False。因此,使用列表推导式表达式构造的布尔值列表包含False(all(list)返回False)。
>>> all([num%2!=0 for num in nums2])
False
💡 需要注意的是,all([])(即all(any-empty-iterable))返回True。
检查列表中是否有元素满足条件
要检查列表中是否有元素满足条件,可以使用any()函数。any(some-list)如果至少有一个元素为True,则返回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)
>>> for char in str1:
... print(char)
...
h
e
l
l
o
你可以将其与join()方法一起使用,如下所示:
>>> ''.join(reversed(str1))
'olleh'
将字符串转换为字符列表
假设我们想要将一个字符串拆分为字符列表。我们可以使用列表推导式来实现。
>>> str1 = 'hello'
列表推导式是Python中最强大的一行代码之一。
📒 了解更多关于link_2的信息。
我们遍历字符串并收集每个字符。
>>> chars = [char for char in str1]
>>> chars
['h', 'e', 'l', 'l', 'o']
要将字符串拆分为字符列表,还可以使用list()构造函数:
>>> str1 = 'hello'
>>> chars = list(str1)
>>> chars
['h', 'e', 'l', 'l', 'o']
要将较长的字符串在每次出现空格时拆分为字符串列表,可以使用split()方法。
将英文翻译成简体中文,保留,及HTML标签。
>>> str2 = 'hello world'
>>> str2.split()
['hello', 'world']
从字符串中提取数字
我们已经看到了如何使用列表推导将字符串拆分为字符列表。在那个例子中,我们通过循环遍历字符串收集所有字符。
在这里,我们需要遍历字符串并仅收集数字。那么我们该如何做呢?
- 我们可以在列表推导式表达式中使用
isdigit()
方法设置过滤条件。 c.isdigit()
如果c
是数字,则返回True
;否则返回False
。
>>> str3 = 'python3'
>>> digits = [c for c in str3 if c.isdigit()]
>>> digits
['3']
检查字符串是否以特定子字符串开头
要检查字符串是否以特定的子字符串开头,可以使用startswith()
字符串方法。如果str1
以substring
开头,则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中进行这种有条件的赋值,可以使用三元运算符编写以下一行代码。
>>> 年龄 = 21
>>> 允许 = True if 年龄 >= 18 else False
>>> 允许
True
🔖 了解更多关于 ternary operator in Python 的信息。
生成所有排列
排列指的是在一个组中元素的可能排列方式。如果一个组中有n个唯一元素,则有n!种可能的排列方式。
让我们使用以下列表 letters
:
>>> letters = ['a','b','c']
您可以使用 itertools
模块中的 itertools 来生成给定可迭代对象的所有可能排列。
>>> letters_p = permutations(letters)
>>> letters_p
如上所示,使用 permutations(iterable)
返回一个我们可以使用 for loop 遍历的排列对象:
>>> 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列表和字典推导式这样的一行代码,以及如何将它们与内置函数结合使用来执行所需的任务。
作为下一步,查看这个 beginner-friendly Python projects 的列表。