列表,字典,集合推导式
8.1列表推导式
优点:
- 对于列表解析,编写起来更加精简,可在多种环境中是使用。
- 列表解析比手动的for循环语句运行更快,因为他们的迭代在解释器内部是以C语言的速度执行的,而不是以python代码执行。
基础语法:
li = [1, 2, 3, 4, 5] a = [x + 10 for x in li] # (x + 10)是循环变量,后面跟着循环变量的头部部分,它声明了循环对象,以及一个可迭代对象(for x in li)
例一:30以内所有能被3整除的数
multiples = [i for i in range(30) if i % 3 == 0] print(multiples) ---[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
例二:30以内所有能被3整除的数的平方
def squared(x): return x*x multiples = [squared(i) for i in range(30) if i % 3 is 0] #一个带有返回值的函数 print(multiples)
例三:找到嵌套列表中名字含有两个‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] print([name for lst in names for name in lst if name.count('e') >= 2]) #仔细观察语句顺序,不难理解 ---['Jefferson', 'Wesley', 'Steven', 'Jennifer']
例四:求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
M = [[1,2,3],[4,5,6],[7,8,9]] a =[num for lst in M for num in lst if num % 3 == 0] print(a) ---[3, 6, 9]
例五:打印从100,99,98到0的值
a = [x for x in reversed(range(101))] print(a) ---[100, 99, 98, 97, 96---3,2,1,0]
例六:求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
lst =[(x, y) for x in range(5) if x % 2 == 0 for y in range(6) if y % 2 == 1] print(lst) ---[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
例七:
y = 10 for i in range(100): print(i*y) # 比较两者的差别 l=[i*y for i in range(100)] print(l)
例八:多层循环
l = [] for i in range(1, 10): for j in range(1, 10): s = i * j l.append(s) print(l) l = [i * j for i in range(1, 10) for j in range(1, 10)] # 比较两者差别 print(l)
例九:文件中的使用
lines = [line.rstrip() for line in open('xx.txt') if line[0] == 'p'] # 收集文本中以字母P开头的行 print(lines)
例十:输出[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8], [0, 3, 6, 9, 12]]
ret = [[i*j for j in range(5)] for i in range(4)] print(ret)
8.2字典推导式
例一:将一个字典的key和value对调
mcase = {'a': 10, 'b': 34} mcase_frequency = {mcase[k]: k for k in mcase} # mcase[k],现在代表value值 print(mcase_frequency) ---{10: 'a', 34: 'b'}
例二:合并大小写对应的value值,将k统一成小写
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()} # 字典中get()函数,用于返回指定键的值,如果值不存在则返回默认值 print(mcase_frequency) ---{'a': 17, 'b': 34, 'z': 3}
8.3集合推导式
例:计算列表中每个值的平方,自带去重功能
squared = {x**2 for x in [1, -1, 2]} print(squared) ---{1, 4}
l=[5,-5,1,2,5] print({i**2 for i in l}) ---{25,1,4}