如何在链式调用中获取列表的反向副本(避免在.reverse后使用单独的语句)?

42 投票
11 回答
71961 浏览
提问于 2025-04-16 07:37

这段代码出错了:

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 方法。有没有办法在不单独写一行代码来反转列表的情况下,直接使用索引?怎么做呢?

11 个回答

8

为了更好地理解GWW的回答,如果你想让这段代码正常工作,你只需要使用 list(reversed(formation))。如果你真的想使用 formation.reverse() 这个方法,那你就需要创建一个新的类,继承自 list

>>> class ReversableList(list):
...     def reverse(self):
...         return list(reversed(self))
... 
>>> x = ReversableList([1,2,3])
>>> x.reverse()
[3, 2, 1]

至于这样做是否合适,那又是另一个问题了。

63

你可以使用切片来返回一个反转的列表:

l[::-1]
38

你可以使用 reversed(formation) 来获取 formation 的反向迭代器。也就是说,它会让你从后往前查看这个列表。当你调用 formation.reverse() 时,它会直接把列表里的元素顺序反转,并且不会返回任何东西。

编辑:

我现在明白你想做什么了,我觉得用列表推导式来做这个更简单:

def solution(formation):
    return len([k for k in formation[formation.index(bCamel)+1:] if k == fCamel]) == 0

这段代码基本上是查看第一个 bCamel 之后的所有元素,并收集所有值为 fCamel 的元素。如果这个列表的长度为 0,那你就找到了答案。

这里有几个例子:

>>> k = ['F','F','B','B','F']
>>> solution(k)
False
>>> k = ['F','F','B','B','B']
>>> solution(k)
True
>>> k = ['F','F','B','F','F','B','B']
>>> solution(k)
False
>>> 

撰写回答