Разделите один список другим списком

У меня есть два списка:

monkey = ['2\n', '4\n', '10\n']

banana = ['18\n', '16\n', '120\n']

Что я хочу сделать с этими двумя списками, сделаем третий список, позвольте ему называть его bananasplit.

Мне нужно отбросить ' \n', оставив только значения, а затем сделайте формулу, которая делит на:

bananasplit[0] = banana[0]/monkey[0]

bananasplit[1] = banana[1]/monkey[1] и т.д.

Я экспериментировал с while-loop, но не могу понять. Вот что я сделал:

bananasplit = 3*[None]

i = 0

while i <= 2:

    [int(i) for i in monkey]

    [int(i) for i in banana]

    bananasplit[i] = banana[i]/monkey[i]

    i += 1

Как бы вы разрушили эту небольшую проблему?

Ответ 1

Это сделает следующее:

>>> bananasplit = [int(b) / int(m) for b,m in zip(banana, monkey)]
>>> print(bananasplit)
[9, 4, 12]

Что касается вашего исходного кода, основная проблема заключается в том, что следующие функции no-ops:

[int(i) for i in monkey]
[int(i) for i in banana]

Чтобы превратить их во что-то полезное, вам нужно будет где-то присваивать результаты, например:

monkey = [int(i) for i in monkey]
banana = [int(i) for i in banana]

Наконец, стоит отметить, что в зависимости от версии Python разделение одного целого на другое с помощью / либо обрезает результат, либо возвращает результат с плавающей запятой. См. В Python 2, в чем разница между '/' и '//' при использовании для разделения?

Ответ 2

Попробуйте что-то вроде этого.

bananasplit = [x/y for x, y in zip(map(int, banana), map(int, monkey))]

Если вам нужен результат float (в python 2.x), вы можете изменить int на float или from __future__ import division

Ответ 3

Список итераций и функция карты доставят вас туда очень быстро.

>>> monkey = ['2\n', '4\n', '10\n']

>>> banana = ['18\n', '16\n', '120\n']

>>> monkey = [ float(m.strip()) for m in monkey]

>>> banana = [ float(m.strip()) for m in banana]

>>> def div(a,b):

...     return a/b

... 

>>> map(div, banana, monkey)

[9.0, 4.0, 12.0]

>>> 

Ответ 4

Понимание списка, например [an_expression for some_variable in some_sequence], возвращает вам новый список. Ваш пример просто снижает эти результаты.

# remove trailing whitespace and convert strings to numbers
monkey_numbers = [int(item.strip()) for item in monkey]
banana_numbers = [int(item.strip()) for item in banana]

# a traditional loop
bananasplit = [] # an empty list
for i in range(len(banana_numbers)):
  # make bananasplit longer on each iteration
  bananasplit.append(banana_numbers[i] / monkey_numbers[i])

Затем вы можете использовать понимание списка вместо цикла, так как ваше выражение так просто. Вам понадобится zip function, которая берет два списка и делает список пар.

# divide in one statement
bananasplit = [
  banana_portion / monkey_bunch 
  for (banana_portion, monkey_bunch) in 
  zip(banana_numbers, monkey_numbers)
]

Конечно, вы можете использовать более короткие идентификаторы; Я использовал длинные имена, чтобы упростить их роли.