2016-10-11 5 views
1

У меня есть q = [[7,2,3],[4,5,6]] и r=[[6,1,2],[3,4,5]]. Мне нужно разделить q на соответствующие элементы в r. (Т.е. [[7/6,2/1,3/2],[4/3,5/4,6/5]])Как разделить список списков другим списком списков в Python?

Выход необходимо В = [[1.16,2,1.5], [1.33,1.25,1.2]]

Код:

B= [[float(j)/float(i) for j in q] for i in r].

Однако, я все равно получаю сообщение об ошибке: TypeError: float() аргумент должен быть строкой или числом. Я импортировал подразделение из будущего. Какие-либо предложения?

+2

Вам нужно перебирать значения * в подсписках *, а не сами подвыборы. Прямо сейчас вы пытаетесь преобразовать списки в поплавки ... – Li357

+3

numpy сделает это за вас! – Julien

+0

Мне неудобно использовать numphy, любые предложения по этому коду? – Biotechgeek

ответ

8

Использование zip для сблизить подсписки попарно, а затем использовать его снова, чтобы объединить соответствующие числители и знаменатели:

>>> q = [[7,2,3],[4,5,6]] 
>>> r = [[6,1,2],[3,4,5]] 
>>> [[n/d for n, d in zip(subq, subr)] for subq, subr in zip(q, r)] 
[[1.1666666666666667, 2.0, 1.5], [1.3333333333333333, 1.25, 1.2]] 
+0

Спасибо. Как это работает для целого числа, деленного на один элемент в списке списков? Я попытался сделать это в этом (http://stackoverflow.com/q/39969884/6820344) вопросе, который я разместил. В разделе «Сбой вывода» вы можете видеть, что он не позволяет делать этот тип деления. – Biotechgeek

+0

Если для Python 2 вам нужно '[[float (n)/d для n, d в zip (subq, subr)] для subq, subr в zip (q, r)]' – dawg

+1

Для Python 2 добавьте '' from __future__ import division''. –

2

Вы можете сделать:

>>> out=[] 
>>> for s1, s2 in zip(q, r): 
... inner=[] 
... for n, d in zip(s1, s2): 
...  inner.append(float(n)/d) 
... out.append(inner) 
... 
>>> out 
[[1.1666666666666667, 2.0, 1.5], [1.3333333333333333, 1.25, 1.2]] 

Или используйте NumPy:

>>> q=[[7.,2.,3.],[4.,5.,6.]] 
>>> r=[[6.,1.,2.],[3.,4.,5.]] 
>>> np.array(q)/np.array(r) 
array([[ 1.16666667, 2.  , 1.5  ], 
     [ 1.33333333, 1.25  , 1.2  ]]) 

Или, если у вас есть int литералы:

>>> q=[[7,2,3],[4,5,6]] 
>>> r=[[6,1,2],[3,4,5]] 
>>> np.array(q, dtype=float)/np.array(r) 
array([[ 1.16666667, 2.  , 1.5  ], 
     [ 1.33333333, 1.25  , 1.2  ]]) 
Смежные вопросы