python-列表推导式中的多层for嵌套、多层if else嵌套,情况分析和小结

一、难度层层加码,越加复杂的情况汇总

1.1只有for,没有if else

a_range = range(10)
# 对a_range执行for表达式
a_list = [x * x for x in a_range]
# a_list集合包含10个元素
print(a_list)

# [0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64, 81]

1.2 单层for和单层if else

b_list = [x * x for x in a_range if x % 2 == 0]
# a_list集合包含5个元素
print(b_list)

# [0 ,4 , 16, 36, 64]

1.3 多层for和单层if else

d_list = [(x, y) for x in range(5) for y in range(4)]
# d_list列表包含20个元素
print(d_list)

# [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]

# ---------------等价于---------------

dd_list = []
for x in range(5):
    for y in range(4):
        dd_list.append((x, y))

# [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]

1.4 单层for和多层if else

a=['零' if i==0 else '三' if i==3 else '五' if i==5 else i  for i in range(10) ]

print(a)


# ---------------------等价于-------------------


for i in range(10):
    if i==0:
        print('零')
    else:
        if i==3:
            print('三')
        else:
            if i==5:
                print('五')
            else:
                print(i)

1.5 多层for和多层if else

systax :

[exp1 if con1 else exp2 if con1 else exp3 for data1 in iterable_data1 for data2 in iterable_data2]

示例:

list_x = [10,1]
list_y = [1,8]

print([x if x>y else y if y>x else 'eq' for x in list_x for y in list_y])

# [10, 10, 'eq', 8]

一般来说多层if else语句放在一边,for语句放在另一边,尽可能别交叉放置,极可能出现错误。

二、列表推导式的2种形式

2.1 if语句在for语句后

[exp for x in data if condition]

# 只能存在一个表达式exp

2.2 if语句在for语句前

[exp1 if condition else exp2 for x in data]

# 允许存在2个表达式exp,相对形式1更加强大和灵活,对于不满足条件的数据也能得到处理

 

2.3 两种形式的对比范例

 源于:python列表推导式中使用if-else_jasonLee_lijiaqi的博客-CSDN博客_if 列表推导式

#1-100中3的倍数

p = [x for x in range(1,101) if x%3 == 0]

#1-100中,不是3的倍数的数去相反数,其余的数保持不变

q = [x if x%3==0 else -x for x in range(1,101)]

三、怎么正确地、快速地看懂一个推导式?

3.1 最复杂的情况为例进行讲解

[exp1 if con1 else exp2 if con1 else exp3 for data1 in iterable_data1 for data2 in iterable_data2]
list_x = [10,1]
list_y = [1,8]

print([x if x>y else y if y>x else 'eq' for x in list_x for y in list_y])

# [10, 10, 'eq', 8]

3.2 怎么快速看懂呢?

我觉得最主要的还是学会画圈圈,哪些是一个局部的小整体,这些小整体之间是什么关系?

python-列表推导式中的多层for嵌套、多层if else嵌套,情况分析和小结_第1张图片 

  • if关键字的前面一定是从for迭代中取出来的数据或被处理后的数据,后面一定是条件判断,满足这个条件就会把if前的数据保留;把if前后整体圈起来,表示这是一个不可分割、不可缺失其中之一的整体。
  • for后面一块和in后面一块圈起来,表示这是一个不可分割、不可缺失其中之一的整体,缺谁都不行,这4块是一起生效的。
  • if else是顺序执行的,在前面的先进行判断,在后面的是在前面的if的嵌套语句;for也是顺序执行的,在前面的先迭代,在后面的后迭代;但是if else和for之间肯定是先执行for再执行if else。

你可能感兴趣的:(Python,python)