Python - 列表理解
Python以鼓励开发人员和程序员编写高效、易于理解且几乎同样易于阅读的代码而闻名。该语言最独特的方面之一是Python列表和列表压缩功能,可以在一行代码中使用它们来构建强大的功能。
列表推导用于从其他可迭代对象(如元组、字符串、数组、列表等)创建新列表。列表推导由包含表达式的括号组成,该表达式与 for 循环一起为每个元素执行以迭代每个元素。
句法:
newList = [ expression(element) for element in oldList if condition ]
列表理解的优势
- 比循环更具时间效率和空间效率。
- 需要更少的代码行。
- 将迭代语句转换为公式。
列表推导式与 For 循环
有多种方法可以遍历列表。但是,最常见的方法是使用for循环。让我们看看下面的例子:
Python3
# Empty list
List = []
# Traditional approach of iterating
for character in 'Geeks 4 Geeks!':
List.append(character)
# Display list
print(List)
Python3
# Using list comprehension to iterate through loop
List = [character for character in 'Geeks 4 Geeks!']
# Displaying list
print(List)
Python3
# Import required module
import time
# define function to implement for loop
def for_loop(n):
result = []
for i in range(n):
result.append(i**2)
return result
# define function to implement list comprehension
def list_comprehension(n):
return [i**2 for i in range(n)]
# Driver Code
# Calculate time takens by for_loop()
begin = time.time()
for_loop(10**6)
end = time.time()
# Display time taken by for_loop()
print('Time taken for_loop:',round(end-begin,2))
# Calculate time takens by list_comprehension()
begin = time.time()
list_comprehension(10**6)
end = time.time()
# Display time taken by for_loop()
print('Time taken for list_comprehension:',round(end-begin,2))
Python3
matrix = []
for i in range(3):
# Append an empty sublist inside the list
matrix.append([])
for j in range(5):
matrix[i].append(j)
print(matrix)
Python3
# Nested list comprehension
matrix = [[j for j in range(5)] for i in range(3)]
print(matrix)
Python3
# using lambda to print table of 5
numbers = []
for i in range(1, 6):
numbers.append(i*10)
print(numbers)
Python3
numbers= [i*10 for i in range(1,6)]
print(numbers)
Python3
# using lambda to print table of 5
numbers = list(map(lambda i: i*10, [i for i in range(1,6)]))
print(numbers)
Python3
# Getting square of even numbers from 1 to 10
squares = [n**2 for n in range(1, 11) if n%2==0]
# Display square of even numbers
print(squares)
Python3
# Assign matrix
twoDMatrix = [[10, 20, 30],
[40, 50, 60],
[70, 80, 90]]
# Generate transpose
trans = [[i[j] for i in twoDMatrix] for j in range(len(twoDMatrix))]
print(trans)
Python3
# Initializing string
string = 'Geeks4Geeks'
# Toggle case of each character
List = list(map(lambda i: chr(ord(i)^32), string))
# Display list
print(List)
Python3
# Reverse each string in tuple
List = [string[::-1] for string in ('Geeks', 'for', 'Geeks')]
# Display list
print(List)
Python3
# Explicit function
def digitSum(n):
dsum = 0
for ele in str(n):
dsum += int(ele)
return dsum
# Initializing list
List = [367, 111, 562, 945, 6726, 873]
# Using the function on odd elements of the list
newList = [digitSum(i) for i in List if i & 1]
# Displaying new list
print(newList)
输出:
[‘G’, ‘e’, ‘e’, ‘k’, ‘s’, ‘ ‘, ‘4’, ‘ ‘, ‘G’, ‘e’, ‘e’, ‘k’, ‘s’, ‘!’]
以上是传统方法迭代列表、字符串、元组等的实现。现在列表推导做了同样的任务,也使程序更简单。
列表推导式将使用 for 循环的传统迭代方法转换为一个简单的公式,从而使其易于使用。下面是使用列表理解遍历列表、字符串、元组等的方法。
蟒蛇3
# Using list comprehension to iterate through loop
List = [character for character in 'Geeks 4 Geeks!']
# Displaying list
print(List)
输出:
[‘G’, ‘e’, ‘e’, ‘k’, ‘s’, ‘ ‘, ‘4’, ‘ ‘, ‘G’, ‘e’, ‘e’, ‘k’, ‘s’, ‘!’]
列表推导式在计算上以及在编码空间和时间方面都比 for 循环更有效。通常,它们是用一行代码编写的。下面的程序描述了基于性能的 for 循环和列表理解之间的区别。
蟒蛇3
# Import required module
import time
# define function to implement for loop
def for_loop(n):
result = []
for i in range(n):
result.append(i**2)
return result
# define function to implement list comprehension
def list_comprehension(n):
return [i**2 for i in range(n)]
# Driver Code
# Calculate time takens by for_loop()
begin = time.time()
for_loop(10**6)
end = time.time()
# Display time taken by for_loop()
print('Time taken for_loop:',round(end-begin,2))
# Calculate time takens by list_comprehension()
begin = time.time()
list_comprehension(10**6)
end = time.time()
# Display time taken by for_loop()
print('Time taken for list_comprehension:',round(end-begin,2))
输出:
Time taken for_loop: 0.56
Time taken for list_comprehension: 0.47
从上面的程序中,我们可以看到列表推导式比 for 循环要快得多。
嵌套列表理解
嵌套列表理解只不过是另一个列表理解中的列表理解,这与嵌套 for 循环非常相似。下面是实现嵌套循环的程序:
蟒蛇3
matrix = []
for i in range(3):
# Append an empty sublist inside the list
matrix.append([])
for j in range(5):
matrix[i].append(j)
print(matrix)
输出:
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
现在通过使用嵌套列表推导式,可以用更少的代码行生成相同的输出。
蟒蛇3
# Nested list comprehension
matrix = [[j for j in range(5)] for i in range(3)]
print(matrix)
输出:
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
列表推导式和 Lambda
Lambda 表达式只不过是Python函数的速记表示。将列表推导式与 lambda 结合使用可创建有效的组合。让我们看看下面的例子:
蟒蛇3
# using lambda to print table of 5
numbers = []
for i in range(1, 6):
numbers.append(i*10)
print(numbers)
输出:
[10, 20, 30, 40, 50]
在这里,我们使用了 for 循环来打印 5 个表。
蟒蛇3
numbers= [i*10 for i in range(1,6)]
print(numbers)
输出:
[10, 20, 30, 40, 50]
现在,我们仅使用列表推导来显示 5 的表格。
蟒蛇3
# using lambda to print table of 5
numbers = list(map(lambda i: i*10, [i for i in range(1,6)]))
print(numbers)
输出:
[10, 20, 30, 40, 50]
最后,我们使用 lambda + list comprehension 来显示 5 的表格。 这种组合对于复杂问题以更少的代码行获得有效的解决方案非常有用。
列表理解中的条件
我们还可以在列表推导式中添加条件语句。我们可以使用 range()、 运算符等创建一个列表,并且 cal 还使用 if 语句对列表应用一些条件。
下面是一些示例,它们描述了列表推导式的使用,而不是通过可迭代对象进行迭代的传统方法:
示例 1:显示从 1 到 10 的数字的平方。
蟒蛇3
# Getting square of even numbers from 1 to 10
squares = [n**2 for n in range(1, 11) if n%2==0]
# Display square of even numbers
print(squares)
输出:
[4, 16, 36, 64, 100]
示例 2:显示随机数列表中的偶数元素。
蟒蛇3
# Assign matrix
twoDMatrix = [[10, 20, 30],
[40, 50, 60],
[70, 80, 90]]
# Generate transpose
trans = [[i[j] for i in twoDMatrix] for j in range(len(twoDMatrix))]
print(trans)
输出:
[++++[+10, 40, 70], [20, 50, 80], [30, 60, 90]]
示例 3:切换字符串中每个字符的大小写。
蟒蛇3
# Initializing string
string = 'Geeks4Geeks'
# Toggle case of each character
List = list(map(lambda i: chr(ord(i)^32), string))
# Display list
print(List)
输出:
[‘g’, ‘E’, ‘E’, ‘K’, ‘S’, ‘\x14’, ‘g’, ‘E’, ‘E’, ‘K’, ‘S’, ‘\x01’]
示例 4:反转元组中的每个字符串。
蟒蛇3
# Reverse each string in tuple
List = [string[::-1] for string in ('Geeks', 'for', 'Geeks')]
# Display list
print(List)
输出:
['skeeG', 'rof', 'skeeG']
示例 5:显示列表中所有奇数元素的数字总和。
蟒蛇3
# Explicit function
def digitSum(n):
dsum = 0
for ele in str(n):
dsum += int(ele)
return dsum
# Initializing list
List = [367, 111, 562, 945, 6726, 873]
# Using the function on odd elements of the list
newList = [digitSum(i) for i in List if i & 1]
# Displaying new list
print(newList)
输出:
[16, 3, 18, 18]
关键点
- 对列表的理解是基于当前列表描述和构建列表的有效手段。
- 通常,列表理解比标准列表形成函数和循环更轻量和更简单。
- 我们不应该为列表推导式编写长代码,以确保用户友好的代码。
- 列表的每一个推导都可以在for循环中重写,但是在列表解释的上下文中,每个for循环都不能被重写。