all() 和 any()

这道题目是考什么的?

这道题本质上考的是:

  1. 会读取一行整数列表;
  2. 会判断“所有数字是否都为正数”;
  3. 会判断“是否至少有一个数字是回文数”;
  4. 会使用 Python 的 all()any() 把条件合并起来。

题目要求:

如果列表中所有整数都是正数,并且列表中至少有一个整数是回文数,就输出 True,否则输出 False

所以它的逻辑可以直接翻译成:

结果 = 所有数字都是正数  并且  至少有一个数字是回文数

对应 Python 里就是:

condition1 and condition2

一、先把题目拆成两个条件

题目中有两个条件:

条件 1:所有整数都是正数

比如:

12 9 61 5 14

每个数都大于 0,所以条件 1 成立。

用 Python 表达就是:

all(int(x) > 0 for x in numbers)

意思是:

对于 numbers 里面的每一个 x,都检查 int(x) > 0 是否成立。
如果全部成立,all() 返回 True。
只要有一个不成立,all() 返回 False。

条件 2:至少有一个整数是回文数

回文数就是正着读和倒着读一样的数。

例如:

5      是回文数
9      是回文数
121    是回文数
66     是回文数
123    不是回文数
12     不是回文数

判断一个数字是不是回文数,最简单的方法是先把它当成字符串:

x == x[::-1]

例如:

"121" == "121"[::-1]

"121"[::-1] 的结果还是 "121",所以它是回文。

再比如:

"12" == "12"[::-1]

"12"[::-1] 的结果是 "21",所以 "12" 不是回文。

因此,判断列表中是否至少有一个回文数,可以写成:

any(x == x[::-1] for x in numbers)

意思是:

只要 numbers 里面有一个 x 满足 x == x[::-1],any() 就返回 True。
如果一个都没有满足,any() 返回 False。

二、最终代码

这道题可以这样写:

n = int(input())
numbers = input().split()

print(all(int(x) > 0 for x in numbers) and any(x == x[::-1] for x in numbers))

这里 n 表示数字个数,虽然我们在判断时没有直接使用它,但第一行输入必须读掉,否则第二行数字列表读不到。


三、逐行解释代码

第 1 行

n = int(input())

读取第一行输入。

例如输入:

5

input() 读到的是字符串 "5",所以用 int() 转成整数 5


第 2 行

numbers = input().split()

读取第二行输入。

例如输入:

12 9 61 5 14

input() 得到的是:

"12 9 61 5 14"

.split() 会按照空格拆开,得到:

["12", "9", "61", "5", "14"]

注意,这里列表里的元素还是字符串,不是整数。

为什么这里不急着全部转成整数?

因为判断回文数时,用字符串最方便。比如:

"121"[::-1]

可以直接得到反转后的字符串。


第 3 行

print(all(int(x) > 0 for x in numbers) and any(x == x[::-1] for x in numbers))

这一行分成两部分看。

第一部分:

all(int(x) > 0 for x in numbers)

它检查所有数字是否都大于 0。

对于样例:

["12", "9", "61", "5", "14"]

它相当于检查:

12 > 0
9 > 0
61 > 0
5 > 0
14 > 0

全部成立,所以这一部分结果是:

True

第二部分:

any(x == x[::-1] for x in numbers)

它检查是否至少有一个数字是回文数。

对于样例:

["12", "9", "61", "5", "14"]

逐个看:

"12" == "21"   False
"9" == "9"     True

只要遇到 "9" 是回文数,any() 就可以返回 True

所以第二部分结果也是:

True

最后:

True and True

结果就是:

True

四、为什么这里适合用 all() 和 any()?

这道题的英文描述其实已经暗示了写法:

All the integers are positive.

看到 all,就应该想到:

all(...)

又看到:

any integer is a palindromic integer

看到 any,就应该想到:

any(...)

所以这道题的核心结构就是:

print(all(...) and any(...))

其中:

all(...)

负责判断“全部满足”。

any(...)

负责判断“至少一个满足”。


五、如果不用 all() 和 any(),初学者可以怎么理解?

为了更容易理解,可以先写成普通循环版本:

n = int(input())
numbers = input().split()

all_positive = True
has_palindrome = False

for x in numbers:
    if int(x) <= 0:
        all_positive = False

    if x == x[::-1]:
        has_palindrome = True

print(all_positive and has_palindrome)

这个版本更直观:

先假设所有数都是正数;
先假设没有回文数;

然后一个一个检查:
如果发现某个数 <= 0,就说明“所有数都是正数”这个条件不成立;
如果发现某个数是回文数,就说明“至少有一个回文数”这个条件成立。

最后把两个条件用 and 连起来。

all()any() 只是把这个过程写得更短。


六、常见错误

错误 1:把 input().split() 得到的内容当成整数

numbers = input().split()

得到的是字符串列表:

["12", "9", "61", "5", "14"]

所以判断正数时,必须写:

int(x) > 0

不能直接写:

x > 0

因为 x 是字符串,0 是整数,不能直接比较。


错误 2:判断回文时先转成 int

有些同学可能写:

numbers = list(map(int, input().split()))

这样也可以,但判断回文时还要再转回字符串:

str(x) == str(x)[::-1]

完整写法是:

n = int(input())
numbers = list(map(int, input().split()))

print(all(x > 0 for x in numbers) and any(str(x) == str(x)[::-1] for x in numbers))

这也正确。

不过这道题更简洁的写法是保留字符串:

numbers = input().split()

判断正数时再临时 int(x)


错误 3:把 and 写成 or

题目要求两个条件都满足:

所有数字都是正数
并且
至少有一个回文数

所以应该用:

and

不能用:

or

如果写成 or,意思就变成:

只要有一个条件满足就输出 True

这和题意不一样。


错误 4:不理解 x[::-1]

x[::-1]

表示把字符串反过来。

例如:

"123"[::-1]

结果是:

"321"

所以:

x == x[::-1]

就是判断:

原字符串是否等于反转后的字符串

如果相等,就是回文。


七、这道题的思考模板

以后遇到这种题,可以按这个顺序想:

第一步,先把题目中的条件拆出来:

条件 1:所有整数都是正数
条件 2:至少有一个整数是回文数

第二步,判断条件之间的关系:

两个条件都要满足,所以用 and

第三步,把“所有”翻译成 all()

all(int(x) > 0 for x in numbers)

第四步,把“至少一个”翻译成 any()

any(x == x[::-1] for x in numbers)

第五步,合并输出:

print(all(int(x) > 0 for x in numbers) and any(x == x[::-1] for x in numbers))

八、小练习

题目:

输入一行用空格分隔的单词,判断是否满足下面两个条件:

  1. 所有单词的长度都大于 2;
  2. 至少有一个单词以字母 a 开头。

如果两个条件都满足,输出 True,否则输出 False

提示:

words = input().split()

判断所有单词长度都大于 2,可以考虑:

all(len(word) > 2 for word in words)

判断至少有一个单词以 a 开头,可以考虑:

any(word[0] == "a" for word in words)
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇