用于查询Python列表的语法糖哪个元素首先出现
我有很多元素的列表 我关心它的两个元素,用于查询Python列表的语法糖哪个元素首先出现,python,list,syntactic-sugar,Python,List,Syntactic Sugar,我有很多元素的列表 我关心它的两个元素,a和b 我不知道列表的顺序,也不想排序 如果a出现在b之前,而a出现在b之前,则返回True,否则返回false,是否有一个好的一行程序?您可以使用列表。index: l.index(a) < l.index(b) l.index(a)300k的对手更有效的答案!:)所有测试只测试结果为True的情况。如果答案为False,该怎么办?您测试了a=5,b=10,但也请尝试a=10,b=5,只是为了让它成为一个公平的测试。@MarkByers:很好的观
a
和b
我不知道列表的顺序,也不想排序
如果
a
出现在b
之前,而a
出现在b
之前,则返回True
,否则返回false,是否有一个好的一行程序?您可以使用列表。index
:
l.index(a) < l.index(b)
l.index(a)
当然,这是假设两个项目都存在于列表中。为了多样性,您还可以:
b in l[l.index(a):]
如果a==b
,则为True
。如果你知道a!=b
b in l[l.index(a) + 1:]
MarkByers的响应效果很好,但如果列表很长,并且两个元素都接近末尾,则效率不会很高 要仅遍历列表一次,可以使用以下方法:
l.index(b, l.index(a))
这是所需的一行代码,但您仍需要捕获ValueError
异常。Edit:重写以检查更多情况
好的,这个问题需要更多的工作。Mark Byers完全正确,我的第一次测试只涉及结果为True
的情况。这一点尤其重要,因为我们需要其他解决方案的异常处理程序。因此,我将更详细地介绍:
stmts = {
"Mark Byers: ": "x = l.index(a) < l.index(b)",
"jcollado: ": """try:
x = bool(l.index(b, l.index(a)))
except ValueError:
x = False""",
"Greg Hewgill: ": """try:
x = b in l[l.index(a):]
except ValueError:
x = False"""
}
setups = ["a = 80; b = 90; l = list(range(100))",
"a = 5; b = 10; l = list(range(100))",
"a = 90; b = 80; l = list(range(100))",
"a = 10; b = 5; l = list(range(100))"]
import timeit
for se in setups:
print(se)
for st in stmts:
print(st, timeit.timeit(stmt=stmts[st], setup=se))
print()
因此,从jcollado方法中获得的效率收益主要被异常处理程序的成本所消耗(特别是当它触发时)。这三种解决方案都有一半的时间是赢家(或与赢家持平),因此很难说哪种方法对实际数据最有效。也许你会选择一本最容易阅读的书。真是太棒了!对于Java程序员来说,其含义将完全令人困惑。我喜欢!在我的Gale-Shapley实现中,这个例子变成了
elif-hurst[w]In-women[w][women[w]。index(m):]:
ahahahahah!我不知道timeit模块。我爱你!谢谢,我想在使用l[l.index(n):]
方法时,我没有考虑创建另一个列表对象所需的时间。@jcollado:可能就是这样。祝贺您找到了比两个声誉>300k的对手更有效的答案!:)所有测试只测试结果为True
的情况。如果答案为False
,该怎么办?您测试了a=5,b=10
,但也请尝试a=10,b=5
,只是为了让它成为一个公平的测试。@MarkByers:很好的观点,在这样做之后,我更喜欢您的版本,因为它在所有情况下都具有更好的可读性和可比性。速度最快,但如果我得到一个值错误(比如a
发生在b
之后)然后我必须像你说的那样抓住它,增加我的钓线!不管怎样,谢谢你:)事实上,在蒂姆更新了他上面的新时代之后,我认为你的答案是最好的,尽管不得不添加一个try/except。所以我把我接受的答案改成了你的答案。再次感谢!
a = 80; b = 90; l = list(range(100))
Mark Byers: 5.760545506106019
Greg Hewgill: 3.454101240451526 # Tie!
jcollado: 3.4574156981854536 # Tie!
a = 5; b = 10; l = list(range(100))
Mark Byers: 1.0853995762934794 # Close runner-up!
Greg Hewgill: 1.7265326426395209
jcollado: 1.0528704983320782 # Winner!
a = 90; b = 80; l = list(range(100))
Mark Byers: 5.741535600372806
Greg Hewgill: 3.623253643486848 # Winner!
jcollado: 4.567104188774817
a = 10; b = 5; l = list(range(100))
Mark Byers: 1.0592141197866987 # Winner!
Greg Hewgill: 4.73399648151641
jcollado: 4.77415749512712