以递归方式搜索列表列表并返回原始列表中的索引位置

时间:2018-02-27 04:06:41

标签: python recursion

标题说明了大部分问题。 我们需要再次写下。我们得到了一份总统名单:

    preslst=[['George Washington',1732,1788],['John Adams',1735,1796],['Thomas Jefferson',1743,1800],['James Madison',1751,1808],
     ['James Monroe',1758,1816],['John Quincy Adams',1767,1824],['Andrew Jackson',1767,1828],['Martin Van Buren',1782,1836],
     ['William Henry Harrison',1773,1840],['John Tyler',1790,1840],['James K. Polk',1795,1844],['Zachary Taylor',1784,1848],
  ['Millard Fillmore',1800,1850],['Franklin Pierce',1804,1858],['James Buchanan',1791,1857],['Abraham Lincoln',1809,1861],
     ['Andrew Johnson',1808,1865],['Ulysses S. Grant',1822,1869],['Rutherford B. Hayes',1822,1877],['James A. Garfield',1831,1881],
     ['Chester A. Arthur',1829,1881],['Grover Cleveland',1837,1885],['Benjamin Harrison',1833,1889],['Grover Cleveland',1837,1893],
     ['William McKinley',1843,1897],['Theodore Roosevelt',1858,1901],['William Howard Taft',1857,1909],['Woodrow Wilson',1856,1913],
     ['Warren G. Harding',1865,1921],['Calvin Coolidge',1872,1923],['Herbert Hoover',1874,1929],['Franklin D. Roosevelt',1882,1933],
     ['Harry S. Truman',1884,1945],['Dwight D. Eisenhower',1890,1953],['John F. Kennedy',1917,1961],['Lyndon B. Johnson',1908,1963],
     ['Richard M. Nixon',1913,1969],['Gerald Ford',1913,1974],['Jimmy Carter',1924,1977],['Ronald Reagan',1911,1981],
     ['George H. Bush',1924,1989],['Bill Clinton',1946,1993],['George H.W. Bush',1946,2001],['Barack Obama',1961,2009],
     ['Donald Trump',1946,2017]]

我们被要求定义一个函数(arg1 =在列表中格式化的总统名称,arg2 = preslst),它将以递归方式遍历列表并返回包含正确名称的列表的索引位置。

这就是我目前的情况:

def presPosition(pres,preslst):
    for i in range(0,len(preslst)):
        print('search')
        presname = preslst[i][0]

        if presname ==  pres:
            print("FOUND")
            foundpres = preslst[0]
            return preslst.index(foundpres)

        else:
            return presPosition(pres,preslst[1:]) 

Ex:presPosition('John Adams',preslst)返回的值应为1.

我一直得到0作为返回值,我理解为什么因为在else语句中传递的preslst将具有我正在寻找的名称作为传递列表中的第一项。那么如何让函数返回它在原始列表中的位置呢?

提前致谢。

2 个答案:

答案 0 :(得分:0)

这是一个奇怪的练习,绝对不适合递归。但是,这是你可以做的事情。找到元素时返回列表的长度,最后从原始列表的大小中减去它:

def presPosition(pres,preslst):
    print('search')
    presname = preslst[0][0]

    if presname ==  pres:
        print("FOUND")
        return len(preslst)

    else:
        return presPosition(pres,preslst[1:])

preslst = [...] # your list
print(len(preslst) - presPosition('James Madison', preslst)) # outputs 3

顺便说一下,你不需要for循环,因为你只使用第一个元素然后返回,所以我删除了它。

答案 1 :(得分:0)

您将获得0,因为在每次迭代后,您都会将preslst[1:]传递给下一次迭代。然后返回preslst.index(foundpres),它来自上面的列表,它始终是第0个索引。

相反,我建议遵循。

def presPosition(pres,preslst, next_index=0):
    print('search')
    if next_index == len(preslst):
        print("NOT FOUND")
        return

    presobj = preslst[next_index]
    presname = presobj[0]

    if presname ==  pres:
        print("FOUND")
        return preslst.index(presobj)    # return next_index

    else:
        return presPosition(pres,preslst, next_index+1)