[英]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反向讀取文件 ,那里有一些有趣的答案以及一些鏈接。
如果可以,請考慮將tac
與awk
和grep
混合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.