https://blog.csdn.net/weixin_41611054/article/details/113870870
因为解析式的高效和简洁,所以这里记录下列表、字典、元组、集合解析的各种写法。
通过[]或list()进行列表解析。
单层for循环
- data = [1, 2, 3, 4, 5, 6, 7]
- a = [i for i in data]
- # 或者:a = list(i for i in data)
- # 执行结果:[1, 2, 3, 4, 5, 6, 7]
- # 执行顺序:
- a = []
- for i in data:
- a.append(i)
单层for循环 + if判断(if写在后面)
- data = [1, 2, 3, 4, 5, 6, 7]
- b = [i for i in data if i != 1]
- # 或者:b = list(i for i in data if i != 1)
- # 执行结果:[2, 3, 4, 5, 6, 7]
- # 执行顺序:
- b = []
- for i in data:
- if i != 1:
- b.append(i)
单层for循环 + if判断 + else(if写在前面)
- data = [1, 2, 3, 4, 5, 6, 7]
- c = [i if i != 1 else 0 for i in data]
- # 或者:c = list(i if i != 1 else 0 for i in data)
- # 执行结果:[0, 2, 3, 4, 5, 6, 7]
- # 执行顺序:
- c = []
- for i in data:
- if i != 1:
- c.append(i)
- else:
- c.append(0)
多层for循环
- data = [1, 2, 3, 4, 5, 6, 7]
- d = [i * j for i in data for j in range(3)]
- # 或者:d = list(i * j for i in data for j in range(3))
- # 执行结果:[0, 1, 2, 0, 2, 4, 0, 3, 6, 0, 4, 8, 0, 5, 10, 0, 6, 12, 0, 7, 14]
- # 执行顺序:
- d = []
- for i in data:
- for j in range(3):
- d.append(i * j)
多层for循环 + if判断
- data = [1, 2, 3, 4, 5, 6, 7]
- e = [i * j for i in data for j in range(3) if i == j]
- # 或者:e = list(i * j for i in data for j in range(3) if i == j)
- # 执行结果:[1, 4]
- # 执行顺序:
- e = []
- for i in data:
- for j in range(3):
- if i == j:
- e.append(i * j)
多层for循环 + 多个if判断(多个if可用and连接)
- data = [1, 2, 3, 4, 5, 6, 7]
- f = [i * j for i in data for j in range(3) if i > 1 if j > 1]
- # 或者:f = list(i * j for i in data for j in range(3) if i > 1 if j > 1)
- # 执行结果:[4, 6, 8, 10, 12, 14]
- # 执行顺序:
- f = []
- for i in data:
- for j in range(3):
- if i > 1:
- if j > 1:
- f.append(i * j)
- f = [i * j for i in data for j in range(3) if i > 1 and j > 1]
- # 或者:f = list(i * j for i in data for j in range(3) if i > 1 and j > 1)
- # 执行结果:[4, 6, 8, 10, 12, 14]
- # 执行顺序:
- f = []
- for i in data:
- for j in range(3):
- if i > 1 and j > 1:
- f.append(i * j)
通过{}或dict()进行字典解析。
单层for循环
- data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
- a = {v: k for k, v in data.items()}
- # 或者:a = dict((v, k) for k, v in data.items())
- # 执行结果:{0: 'a', 1: 'b', 2: 'c', 3: 'd'}
- # 执行顺序:
- a = {}
- for k, v in data.items():
- a.update({v: k})
单层for循环 + if判断(if写在后面)
- data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
- b = {k: v for k, v in data.items() if v > 1}
- # 或者:b = dict((k, v) for k, v in data.items() if v > 1)
- # 执行结果:{'c': 2, 'd': 3}
- # 执行顺序:
- b = {}
- for k, v in data.items():
- if v > 1:
- b.update({k: v})
单层for循环 + if判断 + else(if写在前面)
- data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
- c = {k: v if v > 1 else None for k, v in data.items()}
- # 执行结果:{'a': None, 'b': None, 'c': 2, 'd': 3}
- # 执行顺序:
- c = {}
- for k, v in data.items():
- if v > 1:
- c.update({k: v})
- else:
- c.update({k: None})
多层for循环
- data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}
- d = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items()}
- # 或者:d = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items())
- # 执行结果:{'a': 0, 'b': 1, 'c': 2, 'd': 3}
- # 执行顺序:
- d = {}
- for k1, v1 in data.items():
- for k2, v2 in v1.items():
- d.update({k1: v2})
多层for循环 + if判断
- data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}
- e = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0'}
- # 或者:d = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0')
- # 执行结果:{'b': 1, 'c': 2, 'd': 3}
- # 执行顺序:
- e = {}
- for k1, v1 in data.items():
- for k2, v2 in v1.items():
- if k2 != 'num0':
- e.update({k1: v2})
多层for循环 + 多个if判断(多个if可用and连接)
- data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}
- f = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' if v2 > 1}
- # 或者:f = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' if v2 > 1)
- # 执行结果:{'c': 2, 'd': 3}
- # 执行顺序:
- f = {}
- for k1, v1 in data.items():
- for k2, v2 in v1.items():
- if k2 != 'num0':
- if v2 > 1:
- f.update({k1: v2})
- f = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' and v2 > 1}
- # 或者:f = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' and v2 > 1)
- # 执行结果:{'c': 2, 'd': 3}
- # 执行顺序:
- f = {}
- for k1, v1 in data.items():
- for k2, v2 in v1.items():
- if k2 != 'num0' and v2 > 1:
- f.update({k1: v2})
通过()或tuple()进行元组解析,前者返回的是元组,后者返回的是个生成器。生成器占用的内存较小,可通过循环读取。写法和列表解析相似。
- data = [1, 2, 3, 4, 5, 6, 7]
- ## 通过()解析
- a = (i for i in data)
- # 执行结果:<generator object <genexpr> at 0x7f1e24bf1fc0>
- ## 单层for循环
- a = tuple(i for i in data)
- # 执行结果:(1, 2, 3, 4, 5, 6, 7)
- ## 单层for循环 + if判断(if写在后面)
- b = tuple(i for i in data if i != 1)
- # 执行结果:(2, 3, 4, 5, 6, 7)
- ## 单层for循环 + if判断 + else(if写在前面)
- c = tuple(i if i != 1 else 0 for i in data)
- # 执行结果:(0, 2, 3, 4, 5, 6, 7)
- ## 多层for循环
- d = tuple(i * j for i in data for j in range(3))
- # 执行结果:(0, 1, 2, 0, 2, 4, 0, 3, 6, 0, 4, 8, 0, 5, 10, 0, 6, 12, 0, 7, 14)
- ## 多层for循环 + if判断
- e = tuple(i * j for i in data for j in range(3) if i == j)
- # 执行结果:(1, 4)
- ## 多层for循环 + 多个if判断(多个if可用and连接)
- f = tuple(i * j for i in data for j in range(3) if i > 1 if j > 1)
- f = tuple(i * j for i in data for j in range(3) if i > 1 and j > 1)
- # 执行结果:(4, 6, 8, 10, 12, 14)
通过{}或set()进行集合解析。集合中没有重复元素。写法和列表解析相似。
- data = [1, 2, 3, 4, 5, 6, 7, 7, 1]
- ## 通过{}解析
- a = {i for i in data}
- # 执行结果:{1, 2, 3, 4, 5, 6, 7}
- ## 单层for循环
- a = set(i for i in data)
- # 执行结果:{1, 2, 3, 4, 5, 6, 7}
- ## 单层for循环 + if判断(if写在后面)
- b = set(i for i in data if i != 1)
- # 执行结果:{2, 3, 4, 5, 6, 7}
- ## 单层for循环 + if判断 + else(if写在前面)
- c = set(i if i != 1 else 0 for i in data)
- # 执行结果:{0, 2, 3, 4, 5, 6, 7}
- ## 多层for循环
- d = set(i * j for i in data for j in range(3))
- # 执行结果:{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14}
- ## 多层for循环 + if判断
- e = set(i * j for i in data for j in range(3) if i == j)
- # 执行结果:{1, 4}
- ## 多层for循环 + 多个if判断(多个if可用and连接)
- f = set(i * j for i in data for j in range(3) if i > 1 if j > 1)
- f = set(i * j for i in data for j in range(3) if i > 1 and j > 1)
- # 执行结果:{4, 6, 8, 10, 12, 14}