使用 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'
不在列表中,它会引发错误。我正在使用 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()
关于Python递归向后打印列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7425297/