簡體   English   中英

Python遞歸以向后打印列表中的項目

[英]Python recursion to print items from a list backwards

我正在嘗試使用Python向后讀取列表或字符串。 當找到感興趣的項目時,我要打印從該點到列表末尾的所有那些項目。 我可以不用遞歸來做到這一點,而且效果很好,但是我覺得有一種更好的遞歸方法。 :)

沒有遞歸的示例:

items = ['item1', 'item2', 'item3', 'item4', 'item5']

items_of_interest = []
items.reverse()
for item in items:
    items_of_interest.append(item)
    if item == 'item3':
        break
    else:
        continue

items_of_interest.reverse()
print items_of_interest
['item3', 'item4', 'item5']

更新:

為了使問題更清楚,該列表實際上是日志文件中一組字符串的grep的輸出。 這組字符串可能會重復,我只想要最后一組。

遞歸不會使它變得更簡單,而會使它變得更復雜。

for i, item in enumerate(reversed(items), 1):
    if item == 'item3':
        items_of_interest = items[-i:]
        break
else:
    # 'item3' wasn't found

對我來說,這似乎是最簡單有效的方法。 您只需要從末尾遍歷列表到'item3' ,因為reversed返回一個迭代器。

編輯:如果您不介意遍歷整個列表以創建反向版本,則可以使用:

i = list(reversed(items)).index('item3')
items_of_interest = items[-i-1:]

這更簡單。 如果'item3'不在列表中, 'item3'引發錯誤。 我使用list(reversed())而不是[:]然后使用reverse()因為它是列表的一次迭代,而不是兩次。

編輯2:根據您對其他答案的評論,我的第一個版本可以滿足您的要求-從頭開始搜索項目,而無需遍歷整個列表。 問題中的版本必須迭代列表以將其反轉,就像我的第二個版本一樣。

對原始文檔進行最小程度修改但更有效的版本是:

items_of_interest = []
for item in reversed(items):
    items_of_interest.append(item)
    if item == 'item3':
        break
items_of_interest.reverse()

這里不要求遞歸解決方案。 對於從項目的最后一次出現到列表末尾查找列表切片的問題,一種方法是定義輔助功能

>>> def rindex(s, x):
...     for i, y in enumerate(reversed(s)):
...         if x == y:
...             return -i-1
...     raise ValueError
... 
>>> items[rindex(items, "b"):]
['b', 'f']

輔助函數可以稱為rindex因為Python具有rindex方法來查找字符串rindex字符串的最后一次出現。

如果您必須遞歸執行(也許是家庭作業),則可以按照此偽代碼來考慮(尚未完全解決)

def tail_from(list, x):
    return tail_from_aux(list, x, [])

def tail_from_aux(list, element, accumulated):
    if list is empty:
        return []
    elif list ends with element
        return element::accumulated
    else:
        last = list[-1]
        return tail_from_aux(list[:-1], element, last::accumulated)

但是,這是內存密集型的,會遍歷整個列表(效率低下),並且不是Pythonic。 它可能適用於其他語言,但不適用於Python。 不使用。

由於您的實際問題是關於文件的,而在那兒是日志文件,因此您可能無法將此問題歸結為數組搜索。 因此,簽出使用python反向讀取文件 ,那里有一些有趣的答案以及一些鏈接。

如果可以,請考慮將tacawkgrep混合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM