簡體   English   中英

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

[英]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

你對效率完全正確 - 如果你已經排序列表,不要線性迭代,浪費時間

有內置的bisect模塊 - 完全用於已分類容器中的二進制搜索。

你可能正在尋找bisect_right函數。

謝謝大家,使用你的幫助的答案是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM