Python 如何在递归期间创建和编辑列表?

Python 如何在递归期间创建和编辑列表?,python,list,recursion,Python,List,Recursion,我需要创建一个返回两个列表的函数。第一个是包含“find”和“dummy”的字符串列表,表示两个列表中的数字相同的元素。第二个列表包含一定数量的整数,范围由参数“colors”给出,该参数返回找到某个数字的次数。目前我已经完成了第一个列表的任务,但是第二个列表让我有点困惑。此外,必须在过程中使用递归。这是到目前为止的代码 def find(code, guess, colors): if guess == []: return [] else: i

我需要创建一个返回两个列表的函数。第一个是包含“find”和“dummy”的字符串列表,表示两个列表中的数字相同的元素。第二个列表包含一定数量的整数,范围由参数“colors”给出,该参数返回找到某个数字的次数。目前我已经完成了第一个列表的任务,但是第二个列表让我有点困惑。此外,必须在过程中使用递归。这是到目前为止的代码

def find(code, guess, colors):
    if guess == []:
        return []
    else:
        if guess[0] == code[0]:
            return ["found"] + find(code[1:], guess[1:], colors)
        else:
            return ["dummy"] + find(code[1:], guess[1:], colors)
可能的结果如下所示:

>>> find([1,2,3],[3,2,1],6)
[[’dummy’, ’found’, ’dummy’], [0, 0, 1, 0, 0, 0]]
def find(code, guess, colors):
    def sub(code, guess, lst1, lst2):
        if guess:
            if guess[0] == code[0]:
                lst2[code[0]] += 1
                return sub(code[1:], guess[1:], lst1+["found"], lst2)
            else:
                return sub(code[1:], guess[1:], lst1+["dummy"], lst2)
        else:
            return lst1, lst2
    return sub(code, guess, [], [0]*colors)

我喜欢这样的东西:

>>> find([1,2,3],[3,2,1],6)
[[’dummy’, ’found’, ’dummy’], [0, 0, 1, 0, 0, 0]]
def find(code, guess, colors):
    def sub(code, guess, lst1, lst2):
        if guess:
            if guess[0] == code[0]:
                lst2[code[0]] += 1
                return sub(code[1:], guess[1:], lst1+["found"], lst2)
            else:
                return sub(code[1:], guess[1:], lst1+["dummy"], lst2)
        else:
            return lst1, lst2
    return sub(code, guess, [], [0]*colors)
然后

结果是:

(['dummy', 'found', 'dummy', 'found'], [0, 0, 1, 0, 1, 0])

你能解释一下为什么
[0,0,1,0,0,0,0]
你给
find
的参数吗?@jacobieski如果你喜欢玩递归,我想推荐你Friedman&Felleisen的《小阴谋家》。但这不是一本Python书籍。您的代码显然应该返回两个列表,但所有三个
return
语句只返回一个列表。因此,显然您必须将第一个更改为类似于
return[],[]
的内容。对于第二步,您可能需要分两步执行,例如
a,b=find(code[1],guess[1],colors)
,这样您就可以执行
return[“find”]+a,[1]+b
。(你可以通过压缩和解压这两个列表,在一个单独的例子中做到这一点,但这只是在没有充分理由的情况下混淆了你的代码。)在我上面的表达式中是完全任意的,因为我不知道是什么决定了你的第二个列表,只是你根据某种规则或其他规则堆积了一些0和1。你显然需要对你没有解释的实际规则进行编码,而不是总是在
1
前面加上前缀…)你得到[0,0,1,0,0,0,0]你将颜色范围设置为6,你应该得到一个6个零的列表,如果你找到了这个数字,你可以从那里加一到零,在这个例子中,列表中有一个2,所以你把1添加到2的元素中