Because of the high efficiency and conciseness of the analytical formula, various ways of writing lists, dictionaries, tuples, and set parsing are recorded here.
list comprehension
List comprehension via [] or list() .
single layer for loop
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)
Single-layer for loop + if judgment (if written in the back)
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)
Single-layer for loop + if judgment + else (if written in front)
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)
multi-level for loop
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)
Multi-layer for loop + if judgment
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)
Multi-layer for loop + multiple if judgments (multiple ifs can be connected with 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)
dictionary analysis
Dictionary comprehension via {} or dict() .
single layer for loop
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})
Single-layer for loop + if judgment (if written in the back)
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})
Single-layer for loop + if judgment + else (if written in front)
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})
multi-level for loop
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})
Multi-layer for loop + if judgment
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})
Multi-layer for loop + multiple if judgments (multiple ifs can be connected with 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 parsing
Tuple parsing is performed by () or tuple() , the former returns a tuple, and the latter returns a generator. Generators have a small memory footprint and can be read through a loop. The writing method is similar to list comprehension.
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)
collection analysis
Collection parsing via {} or set() . There are no duplicate elements in the set. The writing method is similar to list comprehension.
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}