2017-09-10 3 views
0

J'ai essayé plusieurs heures sur plusieurs jours pour trouver une solution, mais je ne peux pas réussir - je ne sais pas quoi, mais il me manque quelque chose ...Comment récupérer des valeurs de la liste en les comparant aux valeurs suivantes et précédentes?

Besoin d'aide ou de suggestions: -D

Voici ce que je veux faire:

J'ai deux listes:

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

v est un ensemble de valeurs et d est un calcul de ses intervalles

Je voudrais filtrer v afin de récupérer uniquement les vaues qui sont éloignés de moins de, disons, 5.

qui amélioreraient vf (v filtré):

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

Qu'est-ce que je avons réussi à faire jusqu'à présent:

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] 

Il me manque la dernière valeur ...

Mais si je dis:

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 

Merci d'avance pour toute suggestion que vous pouvez avoir :-)

Répondre

0

Essayez ce code:

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 
+0

@ etienne-s, faites-moi savoir si cela fonctionne. –

+0

Waww c'était simple! Fonctionne vraiment bien! J'ai aussi essayé avec v [1] == 22 et vf se débarrasser de v [0] (différence> 5) qui est exactement ce que je voulais, merci beaucoup! ;-) @ kshitij-mittal –

0

Je ne suis pas sûr que je suis exactement ce résultat que vous voulez. J'ai supposé que vous voulez garder v [k] si v [k] -v [k-1] < = 5, et aussi garder le premier élément v [0] pour lequel cette comparaison n'est pas possible. est la façon pythonique de le faire ici que:

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 

qui produit: [1, 3, 69, 72, 125, 130]

Cette utilise compréhensions de liste et une carte comme suit: v est original liste des nombres. vo est une liste de la même longueur que v mais offset, pour faciliter cette comparaison. Cela économise la peine de calculer séparément d. Maintenant vf est construit avec une compréhension de liste comme suit: vf contiendra l'élément x où x est choisi parmi le tuple (x, y) qui est pris, de façon itérative, à partir des tuples formés par les éléments pris dans v et vo, à condition que xy soit inférieur ou égal à 5; sinon x n'est pas ajouté à la vf. Voir l'exemple détaillé ci-dessous.

La carte crée ici la liste des tuples (x, y) de v et vo. Normalement, map est utilisé pour mapper une fonction sur une liste d'arguments (pour appliquer une fonction à des listes d'arguments). Dans ce cas, en utilisant None comme fonction, nous créons simplement une liste de tuples à partir de v et vo comme ceci: [(v [0], vo [0]), (v [1], vo [1]), ...].

Dans la compréhension de la liste que nous faisons alors ceci:

D'abord, (x, y) = (v [0], vo [0]) = (1,1). Puisque x-y = 0 (< = 5) alors x = 1 est inclus dans vf.

Deuxièmement, (x, y) = (v [1], vo [1]) = (3,1).Puisque x-y = 2 (< = 5) alors x = 3 est inclus dans vf.

Troisièmement, (x, y) = (v [2], vo [2]) = (25,3). Puisque x-y = 22 (> 5) alors x = 25 n'est PAS inclus dans vf.

Et ainsi de suite. Vous devrez l'ajuster si j'ai mal compris le résultat attendu, mais cela devrait donner une idée de la façon d'utiliser les listes de compréhension et de mapper pour obtenir le résultat souhaité dans deux lignes de code.

+0

Merci pour l'aide, je vais devoir m'adapter et travailler un peu pour une bonne compréhension ^^. En fait, la première valeur est supposée être supprimée si sa différence avec la seconde est> à 5 –

+0

Donc, garder v [k] si v [k + 1] -v [k] <= 5? Dans ce cas, vous ne garderez jamais la dernière valeur dans v? –

+0

Cela peut arriver et c'est exactement mon problème d'être hors de portée: l'idée est de récupérer n'importe quelle valeur de v si elles sont distantes <= 5 avec les précédentes ou les suivantes. Ainsi, si v [1] - v [0]> 5 ET v [len (v)] - v [len (v) - 1]> 5, les deux ne devraient pas être récupérés dans vf. --- Désolé si je n'étais pas clair dans mon premier post :-) –