use*_*738 2 python recursion list
使用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']
Run Code Online (Sandbox Code Playgroud)
更新:
为了增加问题的清晰度,列表实际上是日志文件中一组字符串的grep的输出.字符串集可能重复,我只想要最后一组.
递归不会使这更简单,它会使它更复杂.
for i, item in enumerate(reversed(items), 1):
if item == 'item3':
items_of_interest = items[-i:]
break
else:
# 'item3' wasn't found
Run Code Online (Sandbox Code Playgroud)
似乎是对我这样做最简单有效的方法.您只需从末尾迭代列表'item3',因为reversed返回迭代器.
编辑:如果您不介意遍历整个列表以创建反转版本,您可以使用:
i = list(reversed(items)).index('item3')
items_of_interest = items[-i-1:]
Run Code Online (Sandbox Code Playgroud)
这更简单.如果'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()
Run Code Online (Sandbox Code Playgroud)