Python带条件生成器实现:按奇偶索引数字和规则填充列表
实现符合要求的Python生成器
核心思路
要满足“偶数索引位置数字的各位之和等于奇数索引位置数字的各位之和”的规则,我们可以按以下逻辑实现:
- 先写一个辅助函数计算5位数的各位之和(因为目标区间是10000-99999,全是5位数)
- 生成器每次产出一对数字:第一个用于偶数索引,第二个用于奇数索引,两者的各位和严格相等
- 为避免重复,生成第二个数时会跳过和第一个数相同的值(不需要去重的话可以去掉该判断)
代码实现
import random def digit_sum(n): """计算数字n的各位之和""" return sum(int(digit) for digit in str(n)) def paired_number_generator(a=10000, b=99999): """生成符合规则的数对:偶数索引数的各位和与奇数索引数的各位和一致""" while True: # 随机生成第一个数,确定目标各位和 first_num = random.randint(a, b) target = digit_sum(first_num) # 找到第二个同各位和的数,避免重复 second_num = first_num while second_num == first_num: second_num = random.randint(a, b) if digit_sum(second_num) == target: break yield first_num yield second_num # 使用示例:生成长度为6的符合规则的列表 lst = [num for _, num in zip(range(6), paired_number_generator())] print(lst)
代码说明
digit_sum函数:将数字转为字符串遍历每一位,转成整数后求和,逻辑简单直观paired_number_generator生成器:- 无限循环产出数对,先确定第一个数的各位和作为目标
- 循环随机生成第二个数,直到找到符合各位和要求且不重复的值
- 先产出第一个数(对应偶数索引),再产出第二个数(对应奇数索引),填充列表时自然满足规则
- 使用示例:通过
zip(range(6))控制生成6个元素,即3组符合要求的数对
验证方法
可以用以下代码验证生成的列表是否符合规则:
def is_valid(lst): for idx in range(0, len(lst)-1, 2): if digit_sum(lst[idx]) != digit_sum(lst[idx+1]): return False return True # 验证示例列表 print(is_valid(lst)) # 正常情况会输出True
内容的提问来源于stack exchange,提问作者LightFury
相关产品推荐
相关产品推荐

