目录
bob = {'pay': 30000 , 'job':'dev','age' : 42 ,'name':'Bob Smith'} sue = {'pay': 40000 , 'job':'hdww','age' : 45 ,'name':'Sue Jones'} people = [bob,sue]
1.列表生成式
1.1 基本语法
[表达式 for 循环计数器 in 可迭代对象]
pay = [person['pay'] for person in people]
print(pay)
[30000, 40000]
1.2 for+if
for表达式还可以在可迭代对象后面加if条件,这样就可以筛选出符合特定条件的元素放入新列表中。
例:
pay = [person['pay'] for person in people if person['age']>42 ]
print(pay)
[40000]
1.3 for+if+else
for表达式还可以在可迭代对象后面加if条件和else条件,这样就可以筛选出符合特定条件的元素放入新列表中。
pay = [person['pay'] if person['age']>42 else 15 for person in people ]
print(pay)
[15, 40000]
1.4 嵌套for
pay = [field for person in people for field in person ]
print(pay)
['pay', 'job', 'age', 'name', 'pay', 'job', 'age', 'name']
在大多数情况下,列表生成式优先于for和if循环,因为:
它们比for循环快得多它们被认为比循环和映射函数更具python特性列表生成式的语法更容易阅读
2.生成器
上面我们把结果和推导式放在了一个方括号里,所以生成的是列表,如果放在圆括号里捏?会不会是元组呢?我们来试一下:
pay = (person['pay'] for person in people)
print(type(pay))
<class 'generator'>
原来是一个生成器。如果想要生成列表或者元组的话,只需要用内置函数 list()
或tuple()
转换一下就好了。
3.结论
列表生成式是一种高效的操作。对于简单的任务,生成式的语法很容易,在复杂的情况下可能会变得棘手。
需要注意的是,列表生成式并不总是最佳选择。它们将整个输出列表加载到内存中。这对于中小型列表是可以接受的,甚至是可取的,因为它使操作更快。
然而,当我们处理大型列表(例如10亿个元素)时,应该避免列表生成式。它可能会导致你的计算机崩溃,由于内存需求量过大。
对于这样大的列表,一个更好的选择是使用一个生成器,它实际上不会在内存中创建一个大的数据结构。生成器在使用项时创建它们。用完后,生成器会将它们扔掉。生成器不会导致内存问题,但它们比列表生成式相对较慢。