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