如何用Python 3实现不等长药剂列表的均匀喷施分配
解决方案
问题分析
我们需要给20株植物分配药剂:
- 每株必喷药剂A
- 药剂B/C/D份数少于20,需尽可能均匀分布到植株上,保证喷施位置间隔尽可能相等
- 最终合并每株的所有药剂为字符串
核心思路
- 初始化每株植物的药剂列表,默认加入药剂A
- 编写位置计算函数,根据总植株数和药剂份数,生成均匀分布的喷施位置
- 遍历非A药剂,将药剂添加到对应位置的列表中
- 把每株的药剂列表合并为字符串,得到最终结果
代码实现
def get_uniform_positions(n_plants, count): """计算药剂需要喷施的均匀位置(0索引)""" if count == 0: return [] if count >= n_plants: # 份数≥植株数时,默认跳过最后一株(可按需调整跳过的位置) return list(range(n_plants - (count - n_plants) if count > n_plants else n_plants)) # 计算步长和起始偏移,保证分布均匀 step = n_plants // count # 调整起始位置,让前后间隔尽可能一致 start = (n_plants - step * (count - 1) - 1) // 2 return [start + i * step for i in range(count)] # 配置参数:总植株数和各药剂份数 total_plants = 20 chemical_counts = { 'a': 20, 'b': 3, 'c': 2, 'd': 1 } # 初始化每株植物的药剂列表 plant_chemicals = [[] for _ in range(total_plants)] # 先添加必喷的药剂A for idx in range(total_plants): plant_chemicals[idx].append('a') # 分配其他药剂 for chem, cnt in chemical_counts.items(): if chem == 'a' or cnt == 0: continue positions = get_uniform_positions(total_plants, cnt) for pos in positions: plant_chemicals[pos].append(chem) # 合并为最终字符串格式(排序保证输出统一) final_result = [''.join(sorted(chem_list)) for chem_list in plant_chemicals] # 打印结果 print(final_result)
代码解释
- 位置计算函数:
- 当药剂份数为0时返回空列表
- 份数≥植株数时,默认跳过最后一株(可修改逻辑调整跳过的位置)
- 通过计算步长和起始偏移,让药剂位置尽可能均匀分布,减少间隔差异
- 初始化与分配:
- 先给每株添加药剂A,满足必喷要求
- 遍历其他药剂,根据计算出的位置添加对应药剂
- 结果格式化:将每株的药剂列表排序后合并为字符串,保证输出格式统一(如
ab而非ba)
测试示例
运行代码后,针对给定的输入参数,输出结果与示例一致:
['a', 'a', 'a', 'ab', 'a', 'ac', 'a', 'a', 'a', 'abd', 'a', 'a', 'a', 'a', 'ac', 'a', 'ab', 'a', 'a', 'a']
特殊情况处理
如果药剂D有19份,代码会自动分配到前19株,最后一株仅喷药剂A,符合需求(具体跳过哪一株可修改get_uniform_positions函数调整)
内容的提问来源于stack exchange,提问作者Sameer Technomark
相关产品推荐
相关产品推荐

