2013-05-07 9 views
19

j'ai 2 listes a et b:Diviser deux listes en 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] 

Est-il possible d'obtenir leur rapport en Python, comme dans la variable c ci-dessus? J'ai essayé de taper:

a/b 

Et je reçois une erreur:

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

Définir le 'ratio' de deux listes. – zch

+0

Et quelle était votre sortie attendue? –

+0

Que voulez-vous dire par rapport à la liste? –

Répondre

7

Vous pouvez le faire en utilisant la compréhension de la liste (élément par élément):

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

Notez que si vous voulez float division, vous devez le spécifier (ou faire flotter les valeurs d'origine):

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

C'est ce dont j'avais besoin! Merci beaucoup! – ely

+3

Ou faites 'from __future__ import division', ou utilisez Python 3 (comme le OP peut déjà l'être). – lvc

+1

@lvc - Je n'aime pas faire une importation qui peut changer complètement la signification du code sauf si c'est absolument nécessaire. Une quantité significative du code que j'écris briserait spectaculairement si je faisais 'de __future__ division d'importation'. – 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] 

Ou dans numpy vous pouvez faire 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

En fait, cela dépend de ce que l'OP voulait dire par "listes de divisions". Supposons qu'il veuille l'interpréter dans le sens de fraction définie (par exemple des éléments qui apparaissent dans les deux listes). –

+1

@esseks Il semble que j'ai deviné juste – jamylak

+0

Deviner est pour les commentaires, pas pour les réponses. En fait, la première chose que je pensais était la fraction de jeu 'A \ B'. –

9

Utilisez zip et une compréhension de la liste:

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

Le haut-map() fonction rend le travail à court de ce genre de problèmes:

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

Merci pour cette réponse! en faisant cela depuis les requêtes sql transformées en listes en numpy je reçois 'argument 2 en map() doit supporter l'itération 'avez-vous une idée sur la façon de résoudre cette erreur? – Marine1