Python - 划分列表并维护原始索引(递归)

时间:2012-11-17 14:25:45

标签: python recursion indexing

我有家庭作业,我必须使用递归来查找列表中的数字/字母/单词的所有出现并返回原始列表中的索引..我已搜索此网站以寻找之前已回答的问题,但我不能找到关于递归的任何答案,并选择继续检查列表,即使在第一次出现之后也是如此。

应该看起来很像:

>>> find_value( [4,7,5,3,2,5,3,7,8,6,5,6], 5)
[2,5,10]
到目前为止,我的代码是这样的:

def find_all(x,y):
    if len(x) == 1 and x[0] == y:
        return [i for i, y in enumerate(x)]
    return find_all(x[1:],y)

虽然它只是最小化列表并给我与索引相同的[0] ..这是真的,对于分割列表..这样我永远不会得到原始索引.. 谢谢 - 如果这已经存在,我很抱歉我已经搜索过但找不到。

4 个答案:

答案 0 :(得分:2)

这是一个简单的非递归解决方案:

def find_value(l, lookfor):
    return [i for i, v in enumerate(l) if v == lookfor]

作为你的家庭作业的一条建议 - 只需将进度通过列表作为find_all的可选第三个参数传递:

def find_value(list, lookfor, position=0)

...并在每次递归时添加一个position

答案 1 :(得分:1)

分配作业通常是为了让你可以探索问题并从中学习。在这种情况下,它是递归,通常对初学者来说很难。

递归的目的是从较小问题的解决方案中构建一个更大问题的答案。所以最好从最小的一个开始:

def find_all(haystack, needle):
    if not haystack:
        # no occurrences can happen
        return []

如果列表不为空,我们可以检查第一个元素是否是我们要查找的内容:

    if haystack[0] == needle:
        occurrences = [0] # the index of the first element is always 0
    else:
        occurrences = []

我们还需要针对较小问题的解决方案:

    recursive_occurences = find_all(haystack[1:], needle)

现在您注意到的问题是返回的索引始终为0.这是因为它们是较小列表中的索引。如果一个项目在较小的列表中有索引0,则意味着它在最大列表中的索引实际上是1(这是您的程序缺少的主要部分),因此:

    for x in recursive_occurences:
        occurrences.append(x+1)

并回答完整的答案:

    return occurrences

我希望这会对你有所帮助,所以你可以自己做下一个功课。

答案 2 :(得分:0)

以下是几种解决方案:

一气呵成,丑陋,但工作:

def find_value(lst, elt):
    return [x + 1 
            for x in ([] if not lst else 
                      (([-1] if lst[0] == elt else []) +
                       find_value(lst[1:], elt)))]

更漂亮,但隐藏索引参数:

def find_value(lst, elt, idx=0):
    return [] if not lst else \
           (([idx] if lst[0] == elt else []) +
            find_value(lst[1:], elt, idx + 1))

漂亮?,内部递归函数很长...更易于维护?

def find_value(lst, elt):
    def _rec(lst, elt, idx):
         if not lst:
             return []
         res = [idx] if lst[0] == elt else []
         return res + _rec(lst[1:], elt, idx + 1)
    return _rec(lst, elt, idx=0)

答案 3 :(得分:0)

这个问题有一个非常简单的解决方案,即使您使用递归来解决分配:

>>> def find_value(array, value):
    *head, tail = array
    array = find_value(head, value) if head else []
    return array + [len(head)] if tail == value else array

>>> find_value([4, 7, 5, 3, 2, 5, 3, 7, 8, 6, 5, 6], 5)
[2, 5, 10]
>>>