1 回答
TA贡献2041条经验 获得超4个赞
我理解你的问题的方式:
有一个输入列表
tier1
,它是一个字符串列表有两个函数,A和Z
A、应用于字符串时,返回字符串列表
Z,当应用于字符串时,返回一些值(类型不清楚,假设字符串列表也是如此)
算法:
对于 的每个元素
tier1
,将 A 应用于该元素如果结果为空列表,则将 Z 应用于该元素,不再进行进一步处理
否则,如果结果不为空,则应用列表中的算法
所以,在 Python 中:
from random import randint
# since you haven't shared what A and Z do,
# I'm just having them do random stuff that matches your description
def function_a(s):
# giving it a 75% chance to be empty
if randint(1, 4) != 1:
return []
else:
# otherwise between 1 and 4 random strings from some selection
return [['a', 'b', 'c'][randint(0, 2)] for _ in range(randint(1,4))]
# in the real case, I'm sure the result depends on `s` but it doesn't matter
def function_z(s):
# otherwise between 0 and 4 random strings from some selection
return [['x', 'y', 'z'][randint(0, 2)] for _ in range(randint(0,4))]
def solution(xs):
# this is really the answer to your question:
rs = []
for x in xs:
# first compute A of x
r = function_a(x)
# if that's the empty list
if not r:
# then we want Z of x instead
r = function_z(x)
else:
# otherwise, it's the same algorithm applied to all of r
r = solution(r)
# whatever the result, append it to rs
rs.append(r)
return rs
tier1 = ['a1', 'a2', 'a3', 'a4']
print(solution(tier1))
请注意,function_a和function_z只是使用您指定的结果类型生成随机结果的函数。你没有分享 A 和 Z 的逻辑到底是什么,所以很难验证结果是否是你想要的。
但是,该功能solution完全按照您所说的去做-如果我理解您对它的解释有些复杂的话。
鉴于您的问题的解决方案基本上是这样的:
def solution(xs):
rs = []
for x in xs:
r = function_a(x)
if not r:
r = function_z(x)
else:
r = solution(r)
rs.append(r)
return rs
甚至可以重写为:
def solution_brief(xs):
return [function_z(r) if not r else solution(r) for r in [function_a(x) for x in xs]]
您应该重新检查您的问题描述。编程的关键是理解问题并将其分解为基本步骤。完成后,代码很快就会跟进。您是否喜欢第一个或第二个解决方案可能取决于经验,也可能取决于微小的性能差异。
顺便说一句,任何写成递归函数的解决方案,也可以写成纯粹的迭代——从内存和性能的角度来看,这通常是更可取的,但递归函数的优点是非常干净和简单,因此更容易维护。
把我的代码放在嘴边,这是同一问题的迭代解决方案,只是为了好玩(无论如何都不是最优的):
def solution_iterative(xs):
if not xs:
return xs
rs = xs.copy()
stack_rs = [rs]
stack_is = [0]
while stack_rs:
r = function_a(stack_rs[-1][stack_is[-1]])
if not r:
stack_rs[-1][stack_is[-1]] = function_z(stack_rs[-1][stack_is[-1]])
stack_is[-1] += 1
else:
stack_rs[-1][stack_is[-1]] = r
stack_rs.append(r)
stack_is.append(0)
while stack_is and stack_is[-1] >= len(stack_rs[-1]):
stack_is.pop()
stack_rs.pop()
if stack_is:
stack_is[-1] += 1
return rs
添加回答
举报