2015-12-27 13 views
5

Esiste una funzione in Python per ottenere la differenza tra due o più valori in un elenco? Così, in questi due elenchi:funzione della differenza tra il valore

list1 = [1, 5, 3, 7] 
list2 = [4, 2, 6, 4] 

ho bisogno di calcolare la differenza tra ogni valore di Lista1 e Lista2.

for i in list1: 
    for ii in list2: 
     print i -ii 

Questo dà valori negativi, ma voglio la sottrazione tra i valori delle due liste solo dal valore massimo al valore più basso per non ottenere valori negativi.

Per gli elenchi di cui sopra, mi aspetto che l'output sia [3, 3, 3, 3].

Grazie.

+3

mostrare i vostri tentativi, così come i risultati attesi ... –

+1

ti aspetti '[3, 3, 3, 3]'? – erip

risposta

6

Si può anche fare se la condizione altro all'interno di comprensione di lista.

>>> [i-j if i>j else j-i for i,j in zip(list1, list2)] 
[3, 3, 3, 3] 
+7

Questo è lo stesso di '[abs (ij) per i, j in zip (lista1, lista2)]' – erip

8

In entrambi i zip le liste, o utilizzare numpy:

>>> list1 = [1, 5, 3, 7] 
>>> list2 = [4, 2, 6, 4] 
>>> [a-b for a,b in zip(list1, list2)] 
[-3, 3, -3, 3] 
>>> import numpy as np 
>>> np.array(list1) - np.array(list2) 
array([-3, 3, -3, 3]) 

Ricordarsi di gettare la matrice di nuovo ad un elenco come necessario.

edit:

In risposta al nuovo requisito che sono necessari i valori assoluti: è possibile aggiungere abs nella lista di comprensione:

>>> [abs(a-b) for a,b in zip(list1, list2)] 
[3, 3, 3, 3] 

e la soluzione numpy cambierebbe a:

>>> map(abs, np.array(list1) - np.array(list2)) 
[3, 3, 3, 3] 
+1

A seconda di cosa l'interlocutore stava chiedendo ... questa risposta sembra buona. – arcseldon

+1

Sono abbastanza sicuro che questo è ciò che è stato chiesto ... altrimenti chiedo a @gho di chiarire;) – timgeb

+2

@timgeb, l'ho modificato, che dire di questo: [ab per a, b in zip (lista1, lista2) se a> b else ba] – gho

10

Supponendo che ci si aspetta [3, 3, 3, 3] come la risposta nella tua domanda, è possibile utilizzare abs e zip:

[abs(i-j) for i,j in zip(list1, list2)] 
2

È possibile utilizzare il metodo cerniera per unire queste due liste. Vedere il tutorial per il metodo zip https://docs.python.org/2/library/functions.html#zip

>>> list1 = [1, 5, 3, 7] 
>>> list2 = [4, 2, 6, 4] 
>>> [abs(x-y) for x, y in zip(list1, list2)] 
[3, 3, 3, 3] 
+0

Questo non è diverso da molti dei già fornito risposte. – erip

1

risposta di Avinash Raj è corretta, o, in alternativa, usando la mappa():

from operator import sub 
C = map(sub, A, B) 
+0

Questo non è corretto. OP desidera * solo elementi positivi * nella matrice. – erip

Problemi correlati