该帖子显示了解决问题的多种方法。总结如下:
- 使用不同的技术,给出一个反转的列表副本,以便可以在此处使用该表达式。两种主要的方法是
formation[::-1]
和list(reversed(formation))
(请参见如何反转列表?)。
类似的解决方案也存在于替换其他列表功能中,例如:
(mylist + [1]).index(1)
(mylist + anotherlist).index(1)
sorted(mylist).index(1)
咬紧牙关,还是使用单独的语句。"简单优于复杂",好的Python风格通常避免使用类似于
((formation.index(bCamel) > (len(formation) - 1 - (formation.reverse()).index(fCamel))))
这样难以理解逻辑的长表达式。请记住,由于我们仍然使用了原地方法,原始的
formation
仍然被修改。这可能很有用,但经常会引起问题。
(请不要在真正的代码中使用此方法。)我们可以滥用条件表达式,使赋值作为副作用发生:
def solution(formation):
return formation.index(bCamel) > (
len(formation) - 1 - (formation.reverse() or formation).index(fCamel)
)
这个想法是由于
formation.reverse()
会返回
None
,它
是 falsey的,因此
or
被强制不要短路,并且
将计算为 反转后作为副作用发生的
formation
。
其他表达式也可以有同样的效果,例如 [formation, formation.reverse()][0]
。这个想法是编写一个包括 .reverse
调用的 表达式,但 评估为 原始列表对象。我们在这里可以任意创造性 - 但再次强调,简单比复杂好
。请不要做这些事情。
请记住,这仍然会修改原始列表,可能会影响未来的计算。
重新设计逻辑以避免需要反转列表。代码尝试反转列表,搜索反转后的列表以找到第一个匹配项的索引,然后将该结果从
len(formation) - 1
中减去——这样做的总体效果是搜索最后一个匹配项的索引。列表没有这样的方法,但字符串有;而恰好我们所有的元素都是单个字符的字符串。我们可以通过用字符串表示阵型来更简单地解决问题:
def solution(formation):
return formation.index(bCamel) > formation.rindex(fCamel)
solution('F BF')
我们也可以以不同的方式考虑这个问题:“列表的第一个
bCamel之后是否存在
fCamel
?” 接受的答案展示了使用列表推导式来迭代“列表中第一个
bCamel之后的部分”,制作那里所有
fCamel
的列表,并检查该列表是否非空。但我们可以更简单地完成它:
def solution(formation):
return fCamel not in formation[formation.index(bCamel)+1:]
甚至有更聪明的方法来编写这个代码,例如使用迭代器的Stefan的答案。
这样的解决方案是针对代码所解决的问题具体而言的,并没有回答一般性的问题。然而,在其他情境中可能会找到类似的解决方案。