列表中第一次出现的索引(不等式匹配)

时间:2018-02-19 12:14:33

标签: python list

A=[2,3,5,7,11,13]
print(A.index(5))

答案是2, 但我需要的是第一个大于4的答案(答案是相同的 - 2)。 我可以应用while循环,但是有更优雅或内置的方法吗? 在我的问题中,列表按升序排序(无重复), 我的目标是将它分成两个列表:低于或等于4,大于4;如果列表已排序,则扫描它两次(甚至一次)将是多余的。

5 个答案:

答案 0 :(得分:5)

如同@ DanD.lied,您可以使用bisect模块,在您的示例中,您可以使用bisect_left

>>> import bisect
>>> bisect.bisect_left(A, 5)
2

这将使用二进制搜索,因为您的数据已经过排序,这比线性搜索(O(logN)而非O(N))更快。

如果您希望第一个值的索引大于4,那么您可以切换到bisect_right

>>> bisect.bisect_right(A, 4)
2

答案 1 :(得分:3)

你对效率完全正确 - 如果你已经已经排序列表,不要线性迭代,浪费时间

内置bisect模块 - 完全用于已排序容器中的二进制搜索。

您可能正在寻找bisect_right功能。

答案 2 :(得分:1)

谢谢大家,使用你的帮助的答案是:

import bisect
A=[2,3,5,7,11,13]
N=bisect.bisect_right(A,4)
print(A[:N]) #[2,3]
print(A[N:]) #[5,7,11,13]

答案 3 :(得分:0)

next与默认参数一起使用:

val = next((i for i, x in enumerate(A) if x > 4), len(A))

鉴于上述结果,您可以执行以下操作:

left, right = A[:val], A[val:]

答案 4 :(得分:-1)

如果您想要第一次出现,列表理解可以解决问题:

A=[2,3,5,7,11,13]
[x > 4 for x in A].index(True)

Out[341]: 2

分手:

[x for x in A if x > 4]
Out[345]: [5, 7, 11, 13]