python小技巧:列表解析
列表解析是用紧凑的方式来构造列表,起源于数学集合符号。一旦使用列表解析后,会经常使用它们来创建可读性强、紧凑的代码,而且这些语句执行速度也较快,效率较高。
列表解析至少需要包含两个部分,但一般包含三个部分:【expression for-clause condition】
比如:要得到0~20的偶数列表,先用range来生成0~20的数字,然后检查是否为偶数(i%2==0),最后将每个满足条件的元素手机到列表中。
1 >>> [i for i in range(21) if i%2 == 0] 2 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
当然,并不仅限于数字,比如,找到单词中所包含的元音列表
1 >>> word = "solidarity" 2 >>> vowels = "aeiou" 3 >>> [i for i in word if i in vowels] 4 ['o', 'i', 'a', 'i']
还可以从多个序列中,采用复杂条件来得到列表。例如,假设要生成数字对(笛卡尔坐标对),x在0~3,y在0~4,且x>y。通过限制x为偶数可以进一步限制数字对。
1 >>> [(x,y) for x in range(3) for y in range(4) if x > y] 2 [(1, 0), (2, 0), (2, 1)] 3 >>> [(x,y) for x in range(3) for y in range(4) if x > y and x%2 == 0] 4 [(2, 0), (2, 1)]
列表解析还能用于转换,比如,对于包含字母和数字的字符串,希望得到只有数字的列表,需要过滤掉所有非数字的字符,并将字符数字转换为整数。
1 >>> string="John Doe,874 Main St.,East Lansing,MI,48823" 2 >>> [int(c) for c in string if c.isdigit()] 3 [8, 7, 4, 4, 8, 8, 2, 3]
列表解析的完整规则是表达式后跟for语句,然后跟多个if 或者for从句或者无。