2013-05-07 12 views
19

Mam 2 listy a i b:Divide dwie listy w python

a = [3, 6, 8, 65, 3] 
b = [34, 2, 5, 3, 5] 

c gets [3/34, 6/2, 8/5, 65/3, 3/5] 

Czy to możliwe, w celu uzyskania ich stosunek w Pythonie, podobnie jak w zmiennej c powyżej? Próbowałem wpisać:

a/b 

I pojawia się błąd:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for /: 'list' and 'list' 
+6

Określ "stosunek" do dwie listy. – zch

+0

Jaka była twoja oczekiwana wydajność? –

+0

Co masz na myśli według wskaźnika listy? –

Odpowiedz

7

Można to zrobić za pomocą listowych (element po elemencie):

div = [ai/bi for ai,bi in zip(a,b)] 

pamiętać, że jeśli chcesz W przypadku podziału float musisz to określić (lub zmienić pierwotne wartości):

fdiv = [float(ai)/bi for ai,bi in zip(a,b)] 
+1

Tego właśnie potrzebowałem! Wielkie dzięki! – ely

+3

Lub wykonaj 'od __future__ import division' lub użyj Pythona 3 (jako że OP może być już). – lvc

+1

@lvc - Nie lubię robić importu, który może całkowicie zmienić znaczenie kodu, chyba że jest to absolutnie konieczne. Znaczna część kodu, który piszę, złamałaby się spektakularnie, gdybym zrobiła 'from __future__ import division'. – sapi

19
>>> from __future__ import division # floating point division in Py2x 
>>> a=[3,6,8,65,3] 
>>> b=[34,2,5,3,5] 
>>> [x/y for x, y in zip(a, b)] 
[0.08823529411764706, 3.0, 1.6, 21.666666666666668, 0.6] 

Albo w numpy można zrobić a/b

>>> import numpy as np 
>>> a=np.array([3,6,8,65,3], dtype=np.float) 
>>> b=np.array([34,2,5,3,5], dtype=np.float) 
>>> a/b 
array([ 0.08823529, 3.  , 1.6  , 21.66666667, 0.6  ]) 
+0

W rzeczywistości zależy to od tego, co OP miał na myśli "listy dzielące". Załóżmy, że chciałby to zinterpretować w sensie ułamka ustalonego (np. Elementów, które pojawiają się na obu listach). –

+1

@esseks Wydaje się, że odgadłem prawo – jamylak

+0

Zgadywanie dotyczy komentarzy, a nie odpowiedzi. Właściwie pierwszą rzeczą, o której pomyślałem, była frakcja ustawiona "A \ B". –

9

Zastosowanie zip oraz listę zrozumieniem:

>>> a = [3,6,8,65,3] 
>>> b = [34,2,5,3,5] 
>>> [(x*1.0)/y for x, y in zip(a, b)] 
[0.08823529411764706, 3.0, 1.6, 21.666666666666668, 0.6] 
15

Wbudowany map() funkcji sprawia, że ​​szybko się z tego rodzaju problemami:

>>> from operator import truediv 
>>> a=[3,6,8,65,3] 
>>> b=[34,2,5,3,5] 
>>> map(truediv, a, b) 
[0.08823529411764706, 3.0, 1.6, 21.666666666666668, 0.6] 
+0

Dziękuję za tę odpowiedź! kiedy robię to z zapytań sql przekształconych na listy w numpy otrzymuję 'argument 2 do mapowania() musi obsługiwać iterację' czy masz pojęcie jak rozwiązać ten błąd? – Marine1