首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python不等长列表,同时均匀地散布较短的列表

Python不等长列表,同时均匀地散布较短的列表
EN

Stack Overflow用户
提问于 2022-10-15 09:06:11
回答 1查看 33关注 0票数 -1

问题陈述:一排植物需要喷洒化学剂量。在这20种植物中,每种植物都含有20剂化学物质。化学物质B、C和D的剂量各不足20次。它们需要均匀地喷洒在20种植物中,因此,尽我们所能,它们在植物之间的间隔是相等的。

例如输入剂量:

代码语言:javascript
运行
复制
chemical_a = [a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a]
chemical_b = [b, b, b]
chemical_c = [c, c]
chemical_d = [d]

预期结果:

代码语言:javascript
运行
复制
[a, a, a, ab, a, ac, a, a, a, abd, a, a, a, a, ac, a, ab, a, a, a]

正如你所看到的,chemical_b的两边都有3个未填充的b斑点--除了中间剂量,其中一边有2个,另一边有3个。这种情况是不可避免的。如果引进了19剂量的chemical_d,其中一种植物就会错过--那就是什么植物并不重要。

如何使用Python 3解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2022-10-16 03:24:17

递归!

代码语言:javascript
运行
复制
import math

def spread(long, short):
  if long == 1 and short == 1:
    return [True]
  
  if long % 2 == 0:
    left = right = int(long / 2)
    if short == 1:
      return [False] * (left - 1) + [True] + [False] * right # default to fewer lefts if even
    elif short % 2 == 0:
      short = int(short / 2)
      return spread(left, short) + spread(right, short)
    else:
      short = math.floor(short / 2)
      return spread(left - 1, short) + [True] + spread(right, short) # default to fewer lefts if even
  else:
    left = right = math.floor(long / 2)
    if short == 1:
      return [False] * left + [True] + [False] * right
    elif short % 2 == 0:
      short = int(short / 2)
      return spread(left, short) + [False] + spread(right, short)
    else:
      short = math.floor(short / 2)
      return spread(left, short) + [True] + spread(right, short)
    
chemical_a = 20
chemical_b = 3
chemical_c = 2
chemical_d = 1

def transform(x, type):
  if x:
    return type
  else:
    return ''

result_a = map(transform, spread(chemical_a, chemical_a), chemical_a * 'a')
result_b = map(transform, spread(chemical_a, chemical_b), chemical_a * 'b')
result_c = map(transform, spread(chemical_a, chemical_c), chemical_a * 'c')
result_d = map(transform, spread(chemical_a, chemical_d), chemical_a * 'd')

def convertTuple(tup):
    st = ''.join(map(str, tup))
    return st

print(list(map(convertTuple, zip(result_a, result_b, result_c, result_d))))

结果:

代码语言:javascript
运行
复制
['a', 'a', 'a', 'a', 'abc', 'a', 'a', 'a', 'a', 'abd', 'a', 'a', 'a', 'a', 'abc', 'a', 'a', 'a', 'a', 'a']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74078103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档