如何获取一个列表的反向副本(在使用 .reverse 方法后链接其他方法时避免使用单独语句)?

42

这段代码运行失败:

fCamel = 'F'
bCamel = 'B'
gap = ' '

k = ['F', ' ', 'B', 'F']

def solution(formation):
    return ((formation.index(bCamel) > (len(formation) - 1 - (formation.reverse()).index(fCamel))))

solution(k)

我得到一个异常,内容为 AttributeError: 'NoneType' object has no attribute 'index'

我知道问题在于 list.reverse() 修改了列表但是返回了None。我想在翻转后的列表中使用.index方法。有没有办法避免在索引列表之前使用单独的语句来翻转列表?如何实现?


如果您要查找的元素不在列表中会发生什么?也许,如果您描述一下您正在尝试做什么,我们可以帮助您制定更好、更符合“Pythonic”的解决方案。 - GWW
我正在尝试用Python解决那个骆驼难题,以便更好地学习这门语言。基本上,这个函数应该在第一个“B”左边的所有“F”都是真实的情况下返回true。 - nakiya
只是好奇。我看到越来越多的问题没有得到赞同。对我来说,这似乎是一个有趣但简单的问题。为什么人们不多投一些问题的票呢?我经常看到回答获得了大量的投票,这意味着问题至少有潜力带来有趣的解决方案或讨论,但问题本身却没有得到任何投票。对我来说很奇怪(O_O)干杯! - Morlock
@Morlock:我也常常想到这个问题,我总是尽力给任何有趣的问题点赞。 - GWW
list.reverse不会返回列表。这是事实。你有什么问题? - S.Lott
11个回答

0

标题问题已经得到回答,但是对于你真正想要的:

基本上,如果所有的“F”都在第一个“B”的左侧,这个函数应该返回true。

这与没有'B'后面跟着'F'是相同的。检查这种情况的好方法是使用迭代器:

def solution(formation):
    it = iter(formation)
    return not (bCamel in it and fCamel in it)

一些优点:
  • 与每个formation.index(...)解决方案不同,如果搜索的值不存在,它不会崩溃。
  • 只需要O(1)额外空间(不像制作列表的反向副本的解决方案)。
  • 最多只触摸每个元素一次,并尽快停止。即使有数百万个元素,如果列表以['B','F'开头,则它也具有O(1)时间最佳情况(然后立即停止)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接