為了說明我的問題,假設我有一個list,我想將每個元素與下一個元素進行比較,以檢查它們是否具有相同的值。問題是,當我嘗試訪問串列的最后一個元素并將其與“下一個”進行比較時,該元素超出范圍,因此我會收到錯誤訊息。所以,為了避免這種情況,我在訪問最后一個元素時設定了一個條件,所以我避免了比較。
list = [1, 2, 1, 1, 5, 6, 1,1]
for i in range(len(list)):
if i == len(list)-1:
print('Last element. Avoid comparison')
else:
if list[i] == list[i 1]:
print('Repeated')
我想應該有一種更有效的方法來做到這一點。例如,我試圖在 for 回圈的定義中設定條件,如下所示:
for i in range(len(list)) and i < len(list)-1
但那是無效的。關于如何以更有效/更優雅的方式做到這一點的任何建議?
uj5u.com熱心網友回復:
如果你需要從 0 開始,你應該使用:
for i in range(len(list) - 1):
if list[i] == list[i 1]:
print('Repeated')
該引數stop的范圍功能僅僅是整數,所以你可以用價值len(list) - 1,而不是len(list)停止迭代倒數第二個元素。
uj5u.com熱心網友回復:
其他答案已經解決了這個問題,但我認為值得一提的是一種可能更接近慣用 Python 的方法。Python 提供了可迭代解包和其他類似zip函式的工具,以避免通過索引訪問序列的元素。
# Better to avoid shadowing the build-in name `list`
a_list = [1, 2, 1, 1, 5, 6, 1, 1]
for value, following_value in zip(a_list, a_list[1:]):
if value == following_value:
print("Repeated!")
uj5u.com熱心網友回復:
您可以使用以下功能range:
for i in range(1, len(list)):
if list[i-1] == list[i]:
print('Repeated')
這樣,您就不會超出串列。
uj5u.com熱心網友回復:
從一個開始向后看
for i in range(1, len(list)):
if list[i-1] == list[i]:
print('Repeated')
uj5u.com熱心網友回復:
這有效!
list = [1, 2, 1, 1, 5, 6, 1, 1]
for i in range(len(list)):
if i 1 < len(list) and list[i] == list[i 1]:
print('Repeated')
uj5u.com熱心網友回復:
- len(list) 是 8
- range(len(list)) 是 0, 1, ..., 7 但您希望 for 回圈在索引為 6 時跳過,對嗎?
所以考慮到這種情況......if i == len(list)-1:當索引為 7(不是您想要的索引)時,此條件將為 True
只需將其更改為 if i == len(list)-2:
uj5u.com熱心網友回復:
有很多方法可以做到這一點。最常見的一種是使用 zip 將每個專案與其后繼專案配對:
if any(item == successor for item,successor in zip(lst,lst[1:])):
print('repeated')
groupby from itertools 也是一個流行的選擇(但不是最佳選擇):
if any(duplicate for _,(_,*duplicate) in itertools.groupby(lst)):
print('repeated')
for 回圈只需要跟蹤前一個值(不需要索引):
prev = object() # non-matching initial value
for x in lst:
if prev==x: # compare to previous
print('repeated')
break
prev = x # track previous for next iteration
當并行遍歷資料時,迭代器可能很有趣(這里是元素及其前輩):
predecessor = iter(lst) # iterate over items from first
for x in lst[1:]: # iterate from 2nd item
if x == next(predecessor): # compare to corresponding predecessor
print('repeated')
break
uj5u.com熱心網友回復:
list = [1, 2, 1, 1, 5, 6, 1,1]
for i in range(len(list)):
if list[i] in list[i 1:i 2]:
print('repeated')
uj5u.com熱心網友回復:
如果您只使用串列中的數字,您可能想要使用numpy
例如:
import numpy as np
np_arr = np.array(lst) # don't use 'list' for your object name.
diffs = np.diff(np_arr)
diffs_indices = np.where(diffs != 0)[0]
目前尚不清楚您的確切用途,但例如在我的代碼中,您將獲得:
>>> diffs_indexes
array([0, 1, 3, 4, 5])
哪些是元素 [i] != element[i 1] 的索引
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/396685.html
