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

2024-04-18 14:44:52 发布

您现在位置:Python中文网/ 问答频道 /正文

标题说明了大部分问题。我们需要递归地写这个。我们得到了一份总统名单:

    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=presidents name,格式为列表中的格式,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:]) 

例如:presPosition('John Adams',preslst)返回值应该是1。你知道吗

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

提前谢谢。你知道吗


Tags: 列表johnwilliamgeorgejohnsonandrewjamesfranklin
3条回答

以下是如何使用enumerate()for-loop

 def myFunc(pname, plist)    
    presname = pname
    preslist = plist
    for index, tup in enumerate(plist):
        if tup[0] == pname:
            return index
        raise ValueError('value not found in list')

您得到的是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)

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

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循环,因为您只使用第一个元素然后返回,所以我删除了它。你知道吗

相关问题 更多 >