假設我有一個這樣的串列,其中數字在不同的步驟中增加:
[ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
我想回傳串列中第一個元素的索引,其中增加是增量的(僅 1 步)。在這種情況下,23 是第一個位置,從該點開始增加,它的索引是 8,這是我想要的輸出。
實作這一目標的優雅簡單方法是什么?這是我嘗試過的:
>>> for (a,b) in zip(l, l[1:]):
... if b-a == 1:
... print(l.index(a))
... break
更新:在這個特定的設定中,一旦增加成為增量,它將繼續保持這種狀態。增加可能永遠不會變成增量。
uj5u.com熱心網友回復:
解決方案1: operator
from operator import sub, indexOf
L = [ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
print(indexOf(map(sub, L[1:], L), 1))
# prints 8
ValueError: sequence.index(x): x not in sequence如果差異 1 從未發生,則引發,因此可能要使用try/ except。
解決方案2: bisect
這個只需要 O(log n) 時間,使用增量的單調性(正如您評論的“一旦增加成為增量,它將繼續保持這種狀態”)。
from bisect import bisect
L = [ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
class IsIncremental:
def __getitem__(_, i):
return L[i 1] - L[i] == 1
print(bisect(IsIncremental(), False, 0, len(L) - 1))
# prints 8
len(L) - 1如果差異 1 從未發生,則列印。
順便說一句......可讀性
正如PEP 8所說:
切勿使用字符 'l'(小寫字母 el)、[...] 作為單字符變數名稱。在某些字體中,這些字符與數字一和零無法區分。當想使用“l”時,請改用“L”。
uj5u.com熱心網友回復:
腳步:
- 遍歷陣列直到倒數第二個元素。
- 檢查下一個元素值是否與當前元素值相差 1。
- 列印索引并中斷回圈。
代碼:
my_list = [0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
for i in range(len(my_list)-1):
if my_list[i 1] - my_list[i] == 1:
print(i)
break
結果:
8
uj5u.com熱心網友回復:
這是一種迭代方法。我們可以遍歷串列并在每個索引處執行以下操作:
- 如果當前值為前一加一,則不移動增量索引
- 否則,將增量索引重置為當前位置
如果我們到達串列的末尾并且我們有一個早于最后一個位置的增量索引,那么我們就有一個潛在的匹配。
lst = [0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
idx = 0
for i in range(1, len(lst)):
if lst[i] != lst[i-1] 1:
idx = i
if idx < len(lst) - 1:
print("Found index: " str(idx) ", value: " str(lst[idx]))
else:
print("No incremental index found")
這列印:
Found index: 8, value: 23
uj5u.com熱心網友回復:
為每個回圈執行一次并使用當前值檢查先前的值。一旦到達當前值僅比前一個值大 1 的點,回傳陣列中前一個值的索引:
myList = [ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
lastVal = -1000
for i in myList:
if i - lastVal == 1:
print(myList.index(lastVal)) #will print your desired value's index. If this is in a function, replace print with return
break
lastVal = i
if myList.index(lastVal) == len(myList) - 1:
print("There is no incremental increase in your array")
(編輯,用 lastVal 替換 return,固定列印索引)輸出:
8
uj5u.com熱心網友回復:
我的解決方案使用 numpy 并且至少需要一個增加 1.
import numpy as np
l = [0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
l1 = l.copy()
l1.insert(0,0)
l.append(0)
l1, l = np.array(l1), np.array(l)
try:
print(np.where(np.abs(l1-l) == 1)[0][0]-1)
except IndexError:
print ("index 0 is out of bounds for axis 0 with size 0")
8
uj5u.com熱心網友回復:
這是一種使用串列理解來做到這一點的方法
lst = [ 0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
list2 = [i-1 for i,j in enumerate(lst) if j-lst[i-1]==1]
if len(list2)>0:
print(list2[0])
else:
print('No one up number exists')
uj5u.com熱心網友回復:
與之前的答案類似。
myList = [0, 4, 6, 8, 12, 15, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
l0 = 0 #suppose that the initial value is 0
for l1 in myList:
increment = l1 - l0
if increment == 1:
print(myList.index(l0)) #if you want to get the second element, use l1 instead.
break #if you want to get all the first elements that has 1 increment, remove break
l0 = l1 #memorize l1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367464.html
上一篇:相同數字的Python組串列
