在本教程中,我们将学习使用Python列表理解。Python教程是Python语言的综合教程。
Python列表理解
列表理解是一种句法构造,它基于现有列表创建列表。列表推导式提供了一种创建列表的简洁方法。通常需要创建新列表,其中每个元素都是应用于另一个序列或可迭代对象的每个成员的某些操作的结果,或者创建满足特定条件的这些元素的子序列。
Python列表理解用法
列表理解可用于:
- 转换列表
- 过滤列表
列表理解的语法受到数学符号偏移的影响。Python语法的灵感来自Haskell编程语言。
S = {x² : x in {0 ... 16}}
这是用于创建一组整数值的数学符号。
L = [expression [if condition] for variable in sequence [if condition]]
上面的伪代码显示了列表理解的语法。它由三部分组成:for循环、可选条件和表达式。for循环遍历序列。对于每个循环,如果满足条件,就会对表达式求值。如果计算了该值,它将附加到新列表中。可以有多个for循环和if条件。
Python列表理解转换列表
以下示例借助列表理解将一个列表转换为另一个列表。
#!/usr/bin/python a = [1, 2, 3, 4, 5, 6] b = [e * 2 for e in a] print(b)
在第一个示例中,我们通过将每个元素乘以2从现有列表创建一个新列表。
b = [e * 2 for e in a]
a
列表中的每个元素都乘以2,结果被添加到新的b
列表中。
$ ./multiply_elements.py [2, 4, 6, 8, 10, 12]
每个元素都乘以二。
从摄氏温度计算华氏温度
我们有一个以摄氏度为单位的温度列表。我们想创建一个新的以华氏温度表示的温度列表。
#!/usr/bin/python celsius = [22, 28, 33, 42, 52] fahr = [e * 9/5 + 32 for e in celsius] print(fahr)
该示例创建了一个新的华氏温度列表,该列表是根据摄氏温度列表计算得出的。
fahr = [e * 9/5 + 32 for e in celsius]
计算在Python列表理解的第三个表达式部分完成。
$ ./fahrenheit_celsius.py [71.6, 82.4, 91.4, 107.6, 125.6]
Python列表理解过滤列表
在下面的示例中,我们将使用列表理解来过滤列表。
#!/usr/bin/python a = [-4, 2, 0, -1, 12, -3] b = [e for e in a if e > 0] print(b)
我们有一个整数列表。我们创建了一个新列表,其中只包含正整数。
b = [e for e in a if e > 0]
为了只包含正数,我们使用了一个if
条件,它应用于每个元素;只有满足条件的元素才会被包含到新列表中。
$ ./filter_positive.py [2, 12]
下一个示例按类型过滤元素。
#!/usr/bin/python a = ['a', 2, 'c', 12, 3, 'd'] b = [e for e in a if type(e) == int] c = [e for e in a if type(e) == str] print(b) print(c)
我们有一个元素列表,它是整数和字符串。我们创建两个新列表;一个只有整数,一个只有字符串。
b = [e for e in a if type(e) == int]
这里我们创建了一个列表b
,它只包含整数值。type
函数用于确定元素的类型。
$ ./filter_by_type.py [2, 12, 3] ['a', 'c', 'd']
Python列表理解谓词
谓词是一个返回布尔值的函数。如果条件太复杂,我们可以把它放到谓词中。
#!/usr/bin/python def is_vowel(c): vowels = 'aeiou' if c in vowels: return True else: return False sentence = 'There are eagles in the sky.' vowels = [c for c in sentence if is_vowel(c)] print(vowels)
该示例过滤掉句子中的所有元音。
def is_vowel(c): vowels = 'aeiou' if c in vowels: return True else: return False
函数是一个谓词。对于元音字符,它返回True。
vowels = [c for c in sentence if is_vowel(c)]
if条件的逻辑委托给is_vowel
谓词。
$ ./predicate.py ['e', 'e', 'a', 'e', 'e', 'a', 'e', 'i', 'e']
前面的if条件
if
条件也可以放在前面,这样就可以对数据进行转换。
#!/usr/bin/python data = ["even" if i % 2 == 0 else "odd" for i in range(7)] print(data)
在示例中,我们使用列表理解将值转换为“偶数”
和“奇数”
值。
$ ./infront.py ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even']
Python列表理解多个if条件
可以在Python列表理解中使用多个if条件。
#!/usr/bin/python a = [9, 2, 18, 14, 22, 11, 7, 19, 23] b = [e for e in a if e > 10 if e < 20] print(b)
我们从列表a
中创建一个新的整数列表,该列表大于10且小于20。
b = [e for e in a if e > 10 if e < 20]
在这个列表理解中,我们使用了两个if条件。
$ ./multiple_conditions.py [18, 14, 11, 19]
Python列表理解多重for循环
在Python列表理解中可以有多个for循环。
#!/usr/bin/python a = [1, 2, 3] b = ['A', 'B', 'C'] c = [ str(i) + j for i in a for j in b] print(c)
该示例创建了两个列表的笛卡尔积。
c = [ str(i) + j for i in a for j in b]
两个for循环用于创建笛卡尔积。
$ ./multiple_for_loops.py ['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']
下一个示例展示了如何展平Python列表。
#!/usr/bin/python nums = [[1, 2, 3], [3, 4, 5], [6, 7, 8]] c = [ e for num in nums for e in num] print(c)
nums
列表是嵌套列表的列表。我们通过列表理解来展平列表。
c = [ e for num in nums for e in num]
第一个循环遍历外部列表;第二个for循环遍历嵌套列表。
$ ./flatten_list.py [1, 2, 3, 3, 4, 5, 6, 7, 8]
Python嵌套列表理解
Python列表理解中的初始表达式可以是另一个列表理解。
#!/usr/bin/python M1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] M1_tr = [[row[i] for row in M1] for i in range(3)] print(M1_tr)
该示例定义了一个矩阵,列表理解从原始矩阵创建了一个转置矩阵。
$ ./nested_list_comprehension.py [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
埃拉托色尼筛法
Eratosthenes筛法是一种计算素数的古老算法。质数(或素数)是大于1的自然数,除了1和它本身之外没有正约数。该算法迭代地将每个素数的倍数标记为合数(即非素数),从2的倍数开始。
#!/usr/bin/python no_primes = [j for i in range(2, 8) for j in range(i*2, 100, i)] primes = [e for e in range(2, 100) if e not in no_primes] print (primes)
该示例计算100以内的素数。
no_primes = [j for i in range(2, 8) for j in range(i*2, 100, i)]
首先,我们创建一个非素数列表。
primes = [e for e in range(2, 100) if e not in no_primes]
素数就是那些不包含在no_primes
列表中的数字。
$ ./sieve_of_eratosthenes.py [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
在本教程中,我们介绍了Python列表理解。
列出所有Python教程。