python - 如何在 Python 中使用递归编织两个列表

标签 python list recursion

我想编织两个列表并输出所有可能的结果。
例如,
输入:两个列表 l1 = [1, 2], l2 = [3, 4]
输出: [1, 2, 3, 4], [1, 3, 2, 4], [1, 3, 4, 2], [3, 1, 2, 4], [3, 1, 4, 2 ], [3, 4, 1, 2]
注意:我需要保持每个列表中的顺序(例如,1 始终在 2 之前,3 始终在 4 之前)

我解决这个问题的方法是从一个列表中删除头部,递归,然后对另一个列表做同样的事情。代码如下:

all_possibles = []
def weaveLists(first, second, added):
    if len(first) == 0 or len(second) == 0:
        res = added[:]
        res += first[:]
        res += second[:]
        all_possibles.append(res)
        return

    cur1 = first[0]
    added.append(cur1)
    first = first[1:]
    weaveLists(first, second, added)
    added = added[:-1]
    first = [cur1] + first

    cur2 = second[0]
    added.append(cur2)
    second = second[1:]
    weaveLists(first, second, added)
    added = added[:-1]
    second = [cur2] + second


weaveLists([1, 2], [3, 4], [])
print(all_possibles)

我得到的结果是: [[1,2,3,4],[1,3,2,4],[1,3,4,2],[1,3,1,2,4],[1,3,1, 4, 2], [1, 3, 1, 4, 1, 2]]

我不明白为什么对于最后三个列表,第一个列表中的标题 1 没有被删除。

有人可以帮忙吗?谢谢!

最佳答案

你得到这些意想不到的结果的原因是你在这个地方改变了added:

added.append(cur1)

...这将影响调用者添加列表(无意中)。虽然“撤消”操作不会改变列表:

added = added[:-1]

这会创建一个新列表,因此此“撤消”操作不会回滚调用者列表中的更改。

简单的修复方法是将 append 的调用替换为:

added = added + [cur1]

同样的情况也应该发生在第二个区 block 中。

如果您即时传递递归调用的新值,并将这两个代码块替换为:

weaveLists(first[1:], second, added + [first[0]])
weaveLists(first, second[1:], added + [second[0]])

关于python - 如何在 Python 中使用递归编织两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64465327/

相关文章:

Python re.findall() 除了变量

python - 在 Python 中将二维二进制列表转换为十进制数的算法

haskell - fix 函数是替代 while 循环的更好方法吗?

Python 将大写和小写名称的文件视为相同

python - 将 KDE 添加到直方图

r - 来自 data.frames 列表的示例

python - 如何根据Python列表中出现在该元素之前的元素来访问该元素

algorithm - 无休止地添加到 lisp 中的合并排序列表

c - 不返回字符串。这个程序将 123 这样的数字转换为 "One Two Three"这样的单词,为什么最后我什么也没有得到?

python - 在没有 map 的情况下替换 pandas 数据框中的多个值的优雅方法?