Разделите один список другим списком
У меня есть два списка:
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)
]
Конечно, вы можете использовать более короткие идентификаторы; Я использовал длинные имена, чтобы упростить их роли.