Python中的列表生成式

in #cn5 years ago

用过Python的人一定对它的列表生成式(List Comprehensions)印象非常深刻。刚接触列表生成式的时候可能会有点懵,但一旦适应了之后肯定会喜欢其简洁高效的语法。下面把我经常使用的列表生成式做一个总结,欢迎指正。

数据再运算

a = range(0, 10)
b = [x * 2 for x in a]

其运算结果会返回一个新的列表

数据类型转换

r = range(0, 10)  
s = [str(x) for x in a]

排列组合

[a + b for a in 'ABC' for b in '123'] 

其输出为:

['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

使用if做筛选

b = [x*2 for x in a if x%2==0]

把赋值与筛选写在一起:

b = [x*2 for x in range(1, 10) if x%2==0]

稍微复杂一点的,找到所有在list1中,但不在list2中的元素:

list3 = [item for item in list1 if item not in list2]

打印键值对

遍历Python字典,并以自定义方式打印字典中的键值对:

downloads = {'Jan': 250, 'Feb': 382, 'Mar': 422}
[k+'=' + str(v) for k,v in downloads.items()]

针对文件系统使用列表生成式

一条语句列举出”/var/log”中所有以”log”为扩展名的文件:

[f for f in os.listdir("/var/log") if f.endswith('.log')]

函数分组

在列表生成式中,可以根据函数的返回值进行分组。比如:根据首字母是否为“c“对一个列表中的所有单词进行分组:

def group_by(lst, fn):
    return [
        [x for x in lst if fn(x)],
        [x for x in lst if not fn(x)]
    ]
group_by(['fox', 'dog', 'cat', 'people', 'cow', 'chicken'], lambda x: x[0] == 'c')

其输出为:

[['cat', 'cow', 'chicken'], ['fox', 'dog', 'people']]