[英]index of a first occurrence (inequality match) in a list
A=[2,3,5,7,11,13]
print(A.index(5))
答案是 2,但我需要的是第一個大於 4 的(答案相同 - 2)。 我可以應用一個 while 循環,但是有沒有更優雅或內置的方法來做到這一點? 在我的問題中,列表按升序排序(不重復),我的目標是將其拆分為兩個列表:小於或等於 4,大於 4; 並且鑒於列表已排序,掃描它兩次(甚至一次)將是多余的。
正如@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
謝謝大家,使用你的幫助的答案是:
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]
使用next
作為默認參數:
val = next((i for i, x in enumerate(A) if x > 4), len(A))
鑒於上述結果,您可以執行以下操作:
left, right = A[:val], A[val:]
如果你想要第一次出現,列表理解可以做到這一點:
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.