Python一行代码找出所有水仙花数的两种实现方式

山海之间
山海之间
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何使用Python一行代码找出所有水仙花数。通过分解复杂的列表推导式,详细解析了从遍历三位数、判断条件到结果筛选的完整逻辑,并对比展示了使用filter/map函数与纯列表推导式的两种简洁实现方案,帮助读者深入理解Python的高级语法特性。

水仙花数(Narcissistic number)指的是一个3位正整数,其各位数字的立方和等于该数本身。例如:1^3 + 5^3 + 3^3 = 153,因此153是一个水仙花数。

接下来展示如何利用Python的一行代码来找出所有满足条件的水仙花数。

方法一:

>>> 
>>> a = list(map(lambda x: x[1], filter(lambda x: x[0], [(i*100+j*10+k == i**3+j**3+k**3, i**3+j**3+k**3) for i in range(1, 10) for j in range(0, 10) for k in range(0, 10)])))
>>> print(a)
[153, 370, 371, 407]
>>> 

说明:

上述代码可以拆解为三个主要步骤来理解:

a = [(i*100+j*10+k == i**3+j**3+k**3, i**3+j**3+k**3) for i in range(1, 10) for j in range(0, 10) for k in range(0, 10)]
b = filter(lambda x: x[0], a)
c = list(map(lambda x: x[1], b))

第一步是利用列表推导式遍历所有可能的三位数(从100到999)。对于每个数字,计算其各位数字立方和并与原数比较,若相等则标记为True,否则为False。这些标记和对应的数值被封装成元组 (flag, value),并全部存入一个列表中。

第二步是使用filter函数,从第一步生成的列表中提取出标记为True的元组,即筛选出真正的水仙花数。

第三步是使用map函数,从筛选后的元组中提取第二个元素(即数值本身),最终将这些数值转换为列表。

建议加上print语句执行上述三句代码,通过观察输出结果可以更直观地理解代码的执行流程。

方法二:

仅使用列表推导式实现,代码更为紧凑。

>>> a = [i**3+j**3+k**3 for i in range(1, 10) for j in range(0, 10) for k in range(0, 10) if i*100+j*10+k == i**3+j**3+k**3]
>>> print(a)
[153, 370, 371, 407]
>>> 

以上关于Python一行代码找出所有水仙花数的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表