如何通过将值与下一个和上一个值进行比较来从列表中检索值?

时间:2017-09-10 19:50:57

标签: python list filter compare

几天来我一直在努力寻找解决方案,但我不能成功 - 我不知道是什么,但我错过了什么......

需要帮助或建议:-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的vaues。

这将使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

预先感谢您提出的任何建议: - )

2 个答案:

答案 0 :(得分:0)

试试这段代码:

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

答案 1 :(得分:0)

我不确定我是否完全遵循了你想要的结果。我假设你想要保持v [k]如果v [k] -v [k-1] <= 5,并且还保持第一个元素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)。由于x-y = 0(&lt; = 5),因此在vf中包括x = 1。

第二,(x,y)=(v [1],vo [1])=(3,1)。由于x-y = 2(<= 5),因此在vf中包括x = 3。

第三,(x,y)=(v [2],vo [2])=(25,3)。由于x-y = 22(> 5),因此x = 25不包括在vf中。

等等。如果我误解了预期的结果,你必须调整这个,但是这应该让我们知道如何使用列表推导和映射来在两行代码中实现所需的结果。