Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于查询Python列表的语法糖哪个元素首先出现_Python_List_Syntactic Sugar - Fatal编程技术网

用于查询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