You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python 3实现不等长药剂列表的均匀喷施分配

解决方案

问题分析

我们需要给20株植物分配药剂:

  • 每株必喷药剂A
  • 药剂B/C/D份数少于20,需尽可能均匀分布到植株上,保证喷施位置间隔尽可能相等
  • 最终合并每株的所有药剂为字符串

核心思路

  1. 初始化每株植物的药剂列表,默认加入药剂A
  2. 编写位置计算函数,根据总植株数和药剂份数,生成均匀分布的喷施位置
  3. 遍历非A药剂,将药剂添加到对应位置的列表中
  4. 把每株的药剂列表合并为字符串,得到最终结果

代码实现

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)

代码解释

  1. 位置计算函数:
    • 当药剂份数为0时返回空列表
    • 份数≥植株数时,默认跳过最后一株(可修改逻辑调整跳过的位置)
    • 通过计算步长和起始偏移,让药剂位置尽可能均匀分布,减少间隔差异
  2. 初始化与分配:
    • 先给每株添加药剂A,满足必喷要求
    • 遍历其他药剂,根据计算出的位置添加对应药剂
  3. 结果格式化:将每株的药剂列表排序后合并为字符串,保证输出格式统一(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:10:28