集合生成式

如果想要生成集合{1, 4, 9, 16, 25, 36},可使用for-in循环:

s = set()
for i in range(1, 7):
    s.add(i * i)
print(s)    # {1, 4, 36, 9, 16, 25}

上述的解决方案有更好的替代,那就是使用集合生成式。

集合生成式语法

{表示集合元素的表达式 for 自定义的变量 in 可迭代对象}
其中,"表示集合元素的表达式"中通常包含"自定义的变量"。
集合生成式的使用场景,凡是可以通过for-in循环创建的集合,都可以使用集合生成式来创建。

s = {i * i for i in range(1, 7)}    
print(s)    # s = {i * i for i in range(1, 7)}    

在集合生成式中使用if

可以在集合生成式的for-in循环后添加if语句

s = {i * i for i in range(1, 7) if not i % 2}
print(s)        # {16, 4, 36}

# 以上代码相当于:
s = set()
for i in range(1, 7):
    if not i % 2:
        s.add(i * i)   
print(s)    # {16, 4, 36}

在集合生成式中使用双重循环

s = {(i, j) for i in range(1, 4) for j in range(1, 4)}
print(s)
# 以上代码相当于:
s = set()
for i in range(1, 4):
    for j in range(1, 4):
        s.add((i, j))
print(s)
# 既使用双重for-in循环,又使用if语句
s = {(i, j) for i in range(1, 4) for j in range(1, 4) if i != j}
print(s)

返回结果如下:

{(1, 2), (2, 1), (3, 1), (1, 1), (2, 3), (3, 3), (2, 2), (3, 2), (1, 3)}
{(1, 2), (2, 1), (3, 1), (1, 1), (2, 3), (3, 3), (2, 2), (3, 2), (1, 3)}
{(1, 2), (2, 1), (3, 1), (2, 3), (3, 2), (1, 3)}

列表生成式

如果想要生成列表[1, 4, 9, 16, 25, 36],可以使用for-in循环:

L = []
for i in range(1, 7):
    L.append(i * i)
print(L)    # [1, 4, 9, 16, 25, 36]

上述的解决方案有更好的替代,那就是使用列表生成式。

列表生成式语法

[表示列表元素的表达式 for 自定义的变量 in 可迭代对象]
其中,"表示列表元素的表达式"中通常包含"自定义的变量"。
列表生成式的使用场景:凡是可以通过for-in循环创建的列表,都可以使用列表生成式来创建。

L = [i * i for i in range(1, 7)]
print(L)    # [1, 4, 9, 16, 25, 36]

在列表生成式中使用if语句

L = [i * i for i in range(1, 7) if not i % 2]
print(L)    # [4, 16, 36]

在列表生成式中使用双重循环

L = [(i, j) for i in range(1, 4) for j in range(1, 4)]
print(L)    # [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

# 既使用双重for-in循环,又使用if语句
L = [(i, j) for i in range(1, 4) for j in range(1, 4) if not i != j]
print(L)    # [(1, 1), (2, 2), (3, 3)]

列表生成式支持嵌套

可以在一个列表生成式中嵌套另外一个列表生成式

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
L = [[row[i] for row in matrix] for i in range(4)]
print(L)    # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
# 以上代码相当于:
L = []
for i in range(4):
    L.append([row[i] for row in matrix])
print(L)

字典生成式

items = ['Fruits', 'Books', 'Others']
prices = [96, 78, 83]
# 如果想要生成字典:{'Fruits': 96, 'Books': 78, 'Others': 83},可以使用for-in循环:
d = {}
for item, price in zip(items, prices):
    d[item.upper()] = price
print(d)    # {'FRUITS': 96, 'BOOKS': 78, 'OTHERS': 83}

上述的解决方案有更好的替代,那就是使用字典生成式。

字典生成式语法

{表示字典key的表达式: 表示字典value的表达式 for 自定义的表示key的变量, 自定义的表示value的变量 in 可迭代对象}
其中,"表示字典key的表达式"中通常包含"自定义的表示key的变量","表示字典value的表达式"中通常包含"自定义的表示value的变量"
字典生成式的使用场景:凡是可以通过for-in循环创建的字典,都可以使用字典生成式来创建。

items = ['Fruits', 'Books', 'Others']
prices = [96, 78, 83]
d = {item.upper(): price for item, price in zip(items, prices)}
print(d)    # {'FRUITS': 96, 'BOOKS': 78, 'OTHERS': 83}

在字典生成式中使用if

items = ['Fruits', 'Books', 'Others']
prices = [96, 78, 83]
d = {item: price for item, price in zip(items, prices) if price > 80}
print(d)    # {'Fruits': 96, 'Others': 83}

在字典生成式中使用双重for-in

d = {i: j for i in range(1, 4) for j in range(1, 4)}
print(d)    # {1: 3, 2: 3, 3: 3}

星霜荏苒 居诸不息