列表元素按序均匀重复扩展至指定最大长度的实现问题
问题需求
现有一个长度为1-5的可变元素列表,当列表长度小于maximum_length时,需要将列表扩展至该最大长度(不可超过)。要求从第一个元素开始,按原顺序增量扩展并均匀分配元素,当前代码生成的元素重复数量正确但顺序不符合预期,且列表元素可为字符串,排序方案不可行。
示例展示
示例1
current_list: ['#f8f8f8'] 当前输出: ['#f8f8f8', '#f8f8f8', '#f8f8f8', '#f8f8f8', '#f8f8f8'] 期望输出: ['#f8f8f8', '#f8f8f8', '#f8f8f8', '#f8f8f8', '#f8f8f8']
示例2
current_list: ['#090909', '#171717'] 当前输出: ['#090909', '#171717', '#090909', '#171717', '#090909'] 期望输出: ['#090909', '#090909', '#090909', '#171717', '#171717']
示例3
current_list: ['#d8d8d8', '#ececec', '#f1f1f1'] 当前输出: ['#d8d8d8', '#ececec', '#f1f1f1', '#d8d8d8', '#ececec'] 期望输出: ['#d8d8d8', '#d8d8d8', '#ececec', '#ececec', '#f1f1f1']
示例4
current_list: ['#ecede7', '#eff0eb', '#f1f2ed', '#ffffff'] 当前输出: ['#ecede7', '#eff0eb', '#f1f2ed', '#ffffff', '#ecede7'] 期望输出: ['#ecede7', '#ecede7', '#eff0eb', '#f1f2ed', '#ffffff']
当前代码
print([current_list * max_len][0][:max_len])
解决方案
要实现按原顺序均匀分配元素的扩展逻辑,核心是先计算每个元素需要重复的基础次数,再将剩余的分配名额依次给到前面的元素。
以下是修改后的代码:
def expand_list(current_list, max_len): list_len = len(current_list) if list_len >= max_len: return current_list[:max_len] # 计算每个元素的基础重复次数 base_count = max_len // list_len # 计算需要多分配一次的元素数量 extra_count = max_len % list_len result = [] for idx, item in enumerate(current_list): # 前extra_count个元素多重复一次 repeat_times = base_count + (1 if idx < extra_count else 0) result.extend([item] * repeat_times) return result # 测试示例 print(expand_list(['#f8f8f8'], 5)) print(expand_list(['#090909', '#171717'], 5)) print(expand_list(['#d8d8d8', '#ececec', '#f1f1f1'], 5)) print(expand_list(['#ecede7', '#eff0eb', '#f1f2ed', '#ffffff'], 5))
代码说明
- 先判断原列表长度是否已大于等于最大长度,是则直接截取前
max_len个元素返回 - 计算每个元素的基础重复次数
base_count,以及需要额外分配一次的元素数量extra_count - 遍历原列表,前
extra_count个元素在基础次数上加1,其余元素保持基础次数,将元素重复对应次数后加入结果列表
运行后即可得到符合预期的输出。
内容的提问来源于stack exchange,提问作者stwhite
相关产品推荐
相关产品推荐

