Python之枚举法详解

Python之枚举法详解

初识枚举法

枚举法

【枚举法】 将所有情况列举出来,按照筛选条件逐一进行筛选,最后得到答案的方法。

【步骤】
确定枚举的范围
根据条件进行筛选

【例】
使用枚举法找到1-100之间3的倍数。

确定枚举的范围
枚举范围: 1 -100的数字

根据条件进行筛选
筛选条件: 3的倍数

py

for i in range(1, 101):
    if i % 3 == 0:
        print(i)

range()参数

要想遍历一串连续的数字,可以使用 for 变量 in range(): 的方式,在range()的括号中设置遍历的起始值和结束值。
【注意】 结束值是取不到的哦!

  • 只填写1个参数: range(结束值) 默认从0开始,到结束值之前结束
  • 例如: for i in range(5): i的取值是0,1,2,3,4

  • 填写2个参数: range(起始值,结束值) 从起始值开始,到结束值之前结束
  • 例如: for i in range(1,5): i的取值是 1,2,3,4

  • 填写3个参数: range(起始值,结束值,步长) 从起始值开始,到 结束值之前 结束,每次间隔的值是步长
  • 例如: for i in range(1,10,2): i的取值是 1,3,5,7,9

求余和整除

求余:计算一个数除以另一个数的余数,使用 %
整除:计算一个数除以另一个数的商,使用 //

【应用】

  • 判断倍数关系:余数为0
  • 例如:如果一个数字除以3的余数是0,那么它是3的倍数

  • 求个位数字:除以10的余数
  • 例如:35 % 10 得到5,5就是它的个位数字

  • 求2位数字中的十位数字:除以10的商
  • 例如:29 // 10 的结果是2,就是它的十位数字

逻辑运算符

当需要对多个条件进行判断时,可以使用逻辑运算符
and 所有条件都成立时,整个判断才成立
or 只要有一个条件成立,整个判断就成立

既是3的倍数,也是5的倍数

py

if i % 3 == 0 and i % 5 == 0:

2的倍数,或者5的倍数

py

if i % 2 == 0 or i % 5 == 0:

枚举法进阶

枚举法

将枚举的范围逐一列举出来,按照筛选条件逐一进行筛选,最后得到答案的方法。

如何列举枚举范围

如果枚举的范围是有规律的数字,可以直接使用for i in range()逐一列举。
如果枚举的范围不能直接得到,需要先理清得到枚举范围的思路,再把思路转为代码。

【例】 兔子4元一只,鸭子3元一只,刚好花完10元钱,可以买几只兔子和几只鸭子?
【思路】 因为只有10元,所以兔子最多只能买两只,鸭子最多只能买3只。
【列表】列出所有可能的情况,并判断是否满足条件:

兔子 鸭子 总金额 是否满足条件
1 1 7
1 2 10
1 3 13
2 1 11
2 2 14
2 3 17

【代码】

py

for i in range(1, 3):
    for j in range(1, 4):
    if i * 4 + j * 3 == 10:
        print('兔子:',i, '鸭子:', j)

遍历列表

要想逐一得到列表中的元素,可以使用for语句遍历列表。
【格式】for 变量 in 列表:
每次循环,循环变量的值就依次为列表中的元素。

py

blue = ['scratch', 'python', 'C++']
for b in blue:
    print(b)

运行结果

scratch
python
C++

要在列表的所有元素前,都拼接上字符串’hi,’
可以先遍历列表,然后每得到一个元素,就在它前面拼接上字符串。

py

blue = ['scratch', 'python', 'C++']
for b in blue:
    s = 'hi,' + b
    print(s)

运行结果

hi, scratch
hi, python
hi, C++

字符串索引

字符串中的每一个字符都有一个索引值。
其中,索引是从0开始,依次变大1.
使用字符串[索引]的形式,可以得到字符串中的字符。

字符串和列表的相似之处:
索引都是从0开始,依次变大1。
使用字符串[索引] 可以得到字符串中的字符:
使用 列表[索引] 可以得到列表中的元素。

字符串和列表的不同:
列表可以通过 列表[索引]=值的方式修改列表元素。
字符串中的字符不能被修改,使用字符串[索引]=值时程序会报错。

组合问题

要把两个列表中的元素两两进行组合,可以使用for循环嵌套。

py

blue = ['嘻嘻', '痴痴']
red = ['哈嘿', '痴想', '嘻笑']
for b in blue:
    for r in red:
        p= b + r
        print(p)

枚举法详解

枚举法应用

枚举

枚举:就是将结果一一列举出来。在使用枚举之前,需要先确定好枚举的范围。

调料组合

【思考】假设烤鸡的美味程度是所有配料的克数之和,那么要做出指定美味度的烤鸡,该如何组合调料呢?
【例1】使用奥尔良酱和胡椒各1-5g制作出美味度为8的烤鸡

py

for i in range(1,6):
    for j in range(1,6):
        if i + j == 8:
            print(i, j)

【例2】使用黄油1-4g,蜂蜜1-6g和苹果汁1-8g制作出美味度 为15的烤鸡

py

for i in range(1,5):
    for j in range(1,7):
        for k in range(1, 9):
            if i + j == 8:
                print(i, j)

【总结】
枚举两种调料的组合,使用2层for循环
枚举三种调料的组合,使用3层for循环

采购方案

【思考】 用12枚金币采购蜂蜜和奥尔良酱,其中每瓶蜂蜜需要2枚金币,每瓶奥尔良酱4枚金币。那么,蜂蜜和奥尔良酱各买几瓶,可以把金币正好花完?(注意两种都要买哦)

蜂蜜的单价是2枚金币,如果12枚金币都用来买蜂蜜, 那么最多可以买6瓶;蜂蜜的采购范围是1-6;
奥尔良酱的单价是4枚金币,如果12枚金币都用来买蜂 蜜,那么最多可以买3瓶;奥尔良酱的采购范围是1-3;

py

for i in range(1,7):
    for j in range(1,4):
        if i * 2 + j * 4 == 12:
            print(i, j)

【总结】 有时,枚举的范围没有直接给出,我们需要根据题目中的信息来计算

金币分配方案

【思考】 禾木和乌拉乎共收入了12枚金币,每个人都要分至少3枚金币,使用枚举法打印出所有的分配方案吧
【解法一】
根据最少3枚,最多12枚来枚举

py

for i in range(3,13):
    for j in range(3,13):
        if i + j == 12:
            print(i, j)

这种方法中,循环变量 i 和 j 都有10个值,条件判断会执行10*10=100次

【解法二】缩小枚举范围
假如乌拉乎得到了最少的3枚金币,那禾木最多能得到9枚金币,反过来也一样。因此每个人的金币数量是3到9枚。

py

for i in range(3,10):
    for j in range(3,10):
        if i + j == 12:
            print(i, j)

这种方法中,循环 变量 i 和 j 都有7个值,条件判断会执行7*7=49次
【总结】
有时,可以利用题目的信息来缩小枚举范围,这样可以提高筛选速度~

鸡兔同笼

大约一千五百年前,我国古代数学名著《孙子算经》中记载了一道“鸡兔同笼”的问题:
“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”

数千年过去了,我们已经学会使用计算机来帮忙完成一些数学计算,那么如何用Python来解决鸡兔同笼问题呢?

【题目翻译】笼子里有若干只鸡和兔,从上面数有35个头,从下面数有94只脚,问鸡和兔各有几只?

【分析】首先确定循环的边界:全部为兔,最多23只,全部为鸡47只。兔的边界小比鸡的边界小的多,我们从兔开始枚举。

py

for t in range(24):
    if 4*t + 2*(35-t) == 94:
        print('兔:',t, '只 /', '鸡:', 35-t, '只')

运行结果

兔: 12只 / 鸡: 23只

发布于2022-11-29 18:21
没有伞的孩子,必须学会努力奔跑。

赞助 点赞 1

任侠等人对本文发表了2条热情洋溢的评论。
  • 任侠说道: 0
    这是小王看的懂的吗
    1. 老王说道:
      回复 任侠: 小王正在学习的内容,学习笔记!😊
  • 发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注