python 为列表的列表生成所有替换

vawmfj5a  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(146)

我正在用Python构建一个应用程序,需要在其中定义以下类型的函数:

generate_replacements(['a', 'b', ['c', ['e', 'f']]], 1)

预期输出是输入列表的所有可能版本,其中仅替换了一个元素

[
[1, 'b', ['c', ['e', 'f']]],
['a', 1, ['c', ['e', 'f']]],
['a', 'b', 1],
['a', 'b', [1, ['e', 'f']]],
['a', 'b', ['c', 1]],
['a', 'b', ['c', [1, 'f']]],
['a', 'b', ['c', ['e', 1]]]
]

我知道递归是可行的方法,但我真的被困在找出如何最好地开始。

2izufjch

2izufjch1#

你可以从列表中生成替换项,然后如果你注意到你正在替换一个列表,也可以通过函数递归地传递这个列表,如果你使用生成器,这会变得简单一些:

def generate_replacements(l, rep):
    for i in range(len(l)):
        yield l[0:i] + [rep] + l[i+1: ]
        if isinstance(l[i], list):
            yield from (l[0:i] + [rec] + l[i+1: ] 
                        for rec in generate_replacements(l[i], rep))

list(generate_replacements(['a', 'b', ['c', ['e', 'f']]], 1))

这给予:

[[1, 'b', ['c', ['e', 'f']]],
 ['a', 1, ['c', ['e', 'f']]],
 ['a', 'b', 1],
 ['a', 'b', [1, ['e', 'f']]],
 ['a', 'b', ['c', 1]],
 ['a', 'b', ['c', [1, 'f']]],
 ['a', 'b', ['c', ['e', 1]]]]

相关问题