Project Euler第32题:简化Python代码中冗长的多条件if语句
优化Project Euler第32题的数字检查逻辑
你这段代码能跑对结果已经很棒了!针对那个冗长的if判断,这里给你几个不用大改代码的简洁替换方案:
方案1:利用集合特性简化判断
因为你已经确保了xxx的长度是9,只要它的字符集合刚好覆盖1-9且无重复,就符合 pandigital 数的要求。把原来的长判断换成:
if set(xxx) == set('123456789'):
或者更简洁的写法(长度固定为9时,集合长度等于9就意味着没有重复且刚好包含1-9所有数字):
if len(set(xxx)) == 9:
方案2:用all()函数合并多条件
如果不想用集合,也可以用all()遍历检查每个数字是否存在,写法更紧凑:
if all(digit in xxx for digit in '123456789'):
另外提两个小细节(不影响功能但更规范):
- 别用
list当变量名,这是Python的内置类型,换成products这类自定义名称更安全 - 去重的循环可以直接用集合简化:
new_list = list(set(products)),求和的话甚至不用转列表,直接sum(set(products))就行,省掉那一段循环
修改后的完整代码示例(仅替换判断部分+优化变量名和去重):
products = [] # Create list of 9 digit pandigital numbers for a in range(1, 100): for b in range(100, 10000): c = a * b num = len(str(c)) + len(str(a)) + len(str(b)) if num == 9: xxx = str(c) + str(b) + str(a) # 这里用集合判断 if len(set(xxx)) == 9: products.append(c) # 直接存c,不用转字符串再转int # 直接用集合去重并求和 print(sum(set(products)))
内容的提问来源于stack exchange,提问作者Peter4075
相关产品推荐
相关产品推荐

