簡體   English   中英

如何通過與下一個和上一個值進行比較從列表中檢索值?

[英]How to Retrieve Values from list by comparing it to next and previous values?

我幾天來一直在努力尋找解決方案,但是我無法成功-我不知道該怎么辦,但是我缺少了一些東西...

需要幫助或建議:-D

這是我想做的:

我有兩個清單:

v = [1, 3, 25, 67, 69, 72, 85, 120, 125, 130]
d = [2, 22, 42, 2, 3, 13, 35, 5, 5]

v是一組值,而d是其間隔的計算

我想對v進行過濾,以便僅檢索距離小於5的vau。

這將使vf(v過濾):

 vf = [1, 3, 67, 69, 72, 120, 125, 130]

到目前為止,我已經做到了:

for i in range(len(v)-1) :
...     if v[i] - v[i-1] <= 5 or v[i+1] - v[i] <= 5 :
...             df.append(v[i])

vf
[1, 3, 67, 69, 72, 120, 125]

我錯過了最后的價值...

但是如果我說:

for i in range(len(v)) :
...     if v[i] - v[i-1] <= 5 or v[i+1] - v[i] <= 5 :
...             df.append(v[i])
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError : list index out of range

預先感謝您的任何建議:-)

試試這個代碼:

v = [1, 3, 25, 67, 69, 72, 85, 120, 125, 130]
d = [2, 22, 42, 2, 3, 13, 35, 5, 5]
vf = []
for i in range(len(v)) :

    if (i > 0 and (v[i] - v[i-1] <= 5)) or ( (i < len(v) - 1) and (v[i+1] - v[i] <= 5)) :
        vf.append(v[i])
print vf

我不確定我到底在跟蹤您想要什么結果。 我假設如果v [k] -v [k-1] <= 5,則要保留v [k],並且還保留無法進行比較的第一個元素v [0]。 因此,這是執行此操作的pythonic方法:

v = [1, 3, 25, 67, 69, 72, 85, 120, 125, 130]
vo = [1] + v[:-1]
# thus: vo = [1, 1, 3, 25, 67, 69, 72, 85, 120, 125]

vf = [x for (x,y) in map(None,v,vo) if x-y <= 5]
print vf

會產生:[1、3、69、72、125、130]

這使用列表推導和映射,如下所示:v是您的原始數字列表。 vo是與v相同長度但有偏移量的列表,以便於進行比較。 這樣省去了分別計算d的麻煩。

現在,vf的構造方法如下:vf將包含元素x,其中x是從元組(x,y)中選擇的,該元組以迭代方式從由v和vo取值的元素組成的元組中選取,只要xy小於或等於5; 否則,x不會添加到vf中。 請參閱下面的詳細示例。

地圖在這里正在根據v和vo創建元組(x,y)列表。 通常,map用於將函數映射到參數列表(將函數應用於參數列表)。 在這種情況下,通過使用None作為函數,我們只是從v和vo創建元組列表,如下所示:[[v [0],vo [0]),(v [1],vo [1]) ,...]。

在列表理解中,我們正在這樣做:

首先,(x,y)=(v [0],vo [0])=(1,1)。 由於xy = 0(<= 5),因此x = 1包含在vf中。

其次,(x,y)=(v [1],vo [1])=(3,1)。 由於xy = 2(<= 5),因此x = 3包含在vf中。

第三,(x,y)=(v [2],vo [2])=(25,3)。 由於xy = 22(> 5),因此vf中不包含x = 25。

等等。 如果我誤解了預期的結果,則必須進行調整,但這應該給出如何使用列表推導和映射的想法,只需兩行代碼即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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