我有一个函数get_appendable_values(sequence),它接受一个序列(即使是空的),并返回可附加到该序列的所有值的列表(作为最后一个元素).我需要生成4个元素的所有可能的序列,关于此函数中定义的规则,并从空序列开始.

Example :

让我们假设get_appendable_values的实施是:

def get_appendable_values(sequence):
    '''Dummy rules'''
    if len(sequence) == 2:
        return [4, 12]
    if sequence[-1] == 4:
        return [7]
    return [0, 9]

Expected output :

[[0, 0, 4, 7],
[0, 0, 12, 0],
[0, 0, 12, 9],
[0, 9, 4, 7],
[0, 9, 12, 0],
[0, 9, 12, 9],
[9, 0, 4, 7],
[9, 0, 12, 0],
[9, 0, 12, 9],
[9, 9, 4, 7],
[9, 9, 12, 0],
[9, 9, 12, 9]]

我觉得递归是关键,但我想不出来.

推荐答案

是的,递归是关键.要生成大小为4的序列,首先要生成大小为3的所有序列,并向它们添加所有可能的结尾.同样,要生成大小为3的序列,您需要大小为2的所有序列...以此类推,直到大小为0.

def get_appendable_values(sequence):
    '''Dummy rules'''
    if len(sequence) == 2:
        return [4, 12]
    #need a len check here to avoid IndexError when `sequence` is empty
    if len(sequence) > 0 and sequence[-1] == 4:
        return [7]
    return [0, 9]

def generate_sequences(size):
    if size == 0:
        yield []
    else:
        for left_part in generate_sequences(size-1):
            for right_part in get_appendable_values(left_part):
                yield left_part + [right_part]

for seq in generate_sequences(4):
    print(seq)

结果:

[0, 0, 4, 7]
[0, 0, 12, 0]
[0, 0, 12, 9]
[0, 9, 4, 7]
[0, 9, 12, 0]
[0, 9, 12, 9]
[9, 0, 4, 7]
[9, 0, 12, 0]
[9, 0, 12, 9]
[9, 9, 4, 7]
[9, 9, 12, 0]
[9, 9, 12, 9]

Python相关问答推荐

ConversationalRetrivalChain引发键错误

如何使用大量常量优化代码?

利用SCIPY沿第一轴对数组进行内插

ValueError:必须在Pandas 中生成聚合值

Pandas查找给定时间戳之前的最后一个值

为什么fizzbuzz在两个数字的条件出现在一个数字的条件之后时不起作用?

Python键盘模块不会立即检测到按键

是否从Python调用SHGetKnownFolderPath?

突出显示两幅图像之间的变化或差异区域

日志(log)轴上的自定义刻度出现意外的次要刻度标记行为

Abstral@Property-实例化部分实现的类?

每像素级图像处理的毕达式优化

如何验证像这样添加的对象属性:MyObj.newattribute=123

如果任务100%占用CPU,为什么这个多线程代码比顺序代码快?--Python3.10

C++和NumPy之间的Python绑定中复杂的C++生命周期问题

我想把字转换成8位二进制,但某些字符是7位的

如何编写拆分和 Select 每个PANAS列中的第一个元素的Python函数

Python字符串包含不能与方括号一起使用

如何用绘图仪绘制地球轨道图?

如何对 torch 张量中的数据进行切片?