因为解析式的高效和简洁,所以这里记录下列表、字典、元组、集合解析的各种写法。
列表解析
通过[]或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}