2013-09-26 10 views
5

Ho 2 elenchi di numeri, uno chiamato xVar e l'altro chiamato yVar. Userò questi 2 elementi per tracciare i valori X e Y su un grafico. Entrambi hanno lo stesso numero di elementi.python: come rimuovere i valori da 2 elenchi in base a cosa c'è nell'elenco 1

Normalmente, vorrei solo tracciare

ax.scatter(xVar,yVar,s=2,color='tomato'); 

Voglio rimuovere i dati dal yVar che sono oltre un certo valore, per esempio tutti i dati che hanno un valore yVar sopra 100, ma voglio anche per rimuovere il associato xVar valore. Qualcuno può suggerire un modo per creare 2 nuove variabili che rimuovano tutti i valori in yVar su 100 e i valori xVar associati ad essi? Quindi posso semplicemente sostituire xVar & nella mia linea di tracciamento con le nuove variabili.

Grazie ancora una volta tutti,

risposta

11

Ogni volta che si vuole fare qualcosa per i valori corrispondenti di due (o più elenchi, questo è ciò che è zip. Ti dà una lista, dei valori corrispondenti per ogni indice.

Quindi, in questo caso, zip le due liste insieme, poi filtrato l'elenco con zip, poi decomprimere (con zip ancora una volta, come la documentazione spiega):

xVar, yVar = zip(*((x, y) for x, y in zip(xVar, yVar) if y <= 100)) 

Se questo è fonte di confusione, mi permetta mostrano un passo alla volta:

>>> xVar = [1, 200, 300, 10] 
>>> yVar = [150, 100, 50, 200] 
>>> xyVar = zip(xVar, yVar) 
>>> xyVar 
[(1, 150), (200, 100), (300, 50), (10, 500)] 
>>> xyFiltered = [(x, y) for x, y in xyVar if y <= 100] 
>>> xyFiltered 
[(200, 100), (300, 50)] 
>>> xVar, yVar = zip(*xyFiltered) 
[(200, 300), (100, 50)] 
+0

+1 Stavo proprio per scrivere questo. – arshajii

+0

Perfetto, grazie mille. – bigCow

1

senza scrivere il codice, trovano l'indice per la y si desidera rimuovere, salvare l'indice, rimuovere il valore y, quindi rimuovere il valore x allo stesso numero di indice.

+1

Ma ci sarà trucchi/gremlins quando si rimuovono più elementi (ad esempio quando la rimozione è durante l'iterazione della lista) in questo modo .. – user2246674

+0

@ user2246674: Solo un trucco, davvero: Devi invertire la sequenza degli indici prima rimuovendoli. Ma sì, è davvero facile dimenticare di farlo o sbagliarlo. – abarnert

0

indici Trova che corrispondono ai dati che si vogliono mantenere:

ind = [i for i in range(len(yVar)) if yVar[i] < 100] 

e utilizzare solo quei punti:

yVar = [yVar[i] for i in ind] 
xVar = [xVar[i] for i in ind] 
+2

potresti voler controllare [enumerare] (http://docs.python.org/2/library/functions.html#enumerate) – iruvar

+0

@ 1_CR Grazie, sì, questa è una buona opzione. – sashkello

Problemi correlati