列表推导式
- 列表推导式是最受欢迎的Python语言特性之一。
- 它允许你过滤一个容器的元素,用一种简明的表达式转换传递给过滤器的元素,从而生成一个新的列表。
列表推导式的基本形式为:[expr for val in collection if condition]:
# 例如,给定一个字符串列表,我们可以过滤长度大于2的,并且将字母改为大写:
string = ["a","as","bat","car","dove","python"]
[x.upper() for x in string if len(x) > 2]
['BAT', 'CAR', 'DOVE', 'PYTHON']
# 这与上面等价的for循环(result结果):
string = ["a","as","bat","car","dove","python"]
result = []
for x in string:
if len(x)>2:
result.append(x.upper())
result
['BAT', 'CAR', 'DOVE', 'PYTHON']
集合与字典的推导式是列表推导式的自然扩展,用相似的方法生成集合与字典。
- 字典推导式:{key-expr : value-expr for value in collection if condition}
- 集合推导式:{expr for value in colection if condition}
# 假设我们想要一个集合,集合里包含列表中字符串的长度,我们可以通过集合推导式很方便地实现:
string = ["a","as","bat","car","dove","python"]
unique_lengths = {len(x) for x in string}
unique_lengthsue_lengths
{1, 2, 3, 4, 6}
# 我们也可以使用map函数更函数化、更简洁地表达:
string = ["a","as","bat","car","dove","python"]
set(map(len,string))
{1, 2, 3, 4, 6}
# 我们创建一个将字符串与其位置相匹配的字典作为字典推导式的简单示例:
string = ["a","as","bat","car","dove","python"]
loc_mapping = {index : val for index,val in enumerate(string)}
loc_mapping
{0: 'a', 1: 'as', 2: 'bat', 3: 'car', 4: 'dove', 5: 'python'}
嵌入列表推导式
# 有一个包含列表的列表,我们想要获取一个列表包含所有含有2个以上字母e的名字:
all_data = [["John","Emily","Michael","Mary","Steven"],["Maria","Juan","Javier","Natalia","Pilar"]]
# for循环
names_of_interest = []
for names in all_data:
enough_es = [name for name in names if name.count("e")>=2]
names_of_interest.extend(enough_es)
names_of_interest
['Steven']
# 嵌入式列表推导式:
[name for names in all_data for name in names if name.count("e")>=2]
['Steven']
深入:你当然可以嵌套多层的列表推导式,但超过两到三层之后你很可能开始疑惑这种做法是否有利与代码的可读性。
# 列表推导式中的列表推导式也是非常有效的:
some_tuples = [(1,2,3),(4,5,6),(7,8,9)]
[[x for x in tup] for tup in some_tuples]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
《利用python进行数据分析(原书第二版)》韦斯·麦金尼 解读
《利用python进行数据分析(原书第二版)》韦斯·麦金尼 解读
《利用python进行数据分析(原书第二版)》韦斯·麦金尼 解读