将一个列表除以另一个列表

18

我有两个列表,分别如下:

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

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

我想要用这两个列表创建第三个列表,我们称之为bananasplit。

我需要去掉 ' \n' ,只保留数值,并制定一个公式进行分割:

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

香蕉分割[1] = 香蕉[1] / 猴子[1] 等等

我尝试使用 while 循环,但无法得到正确的结果。这是我做的:

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

你会如何解决这个小问题?

4个回答

29
以下内容可以完成此操作:
>>> bananasplit = [int(b) / int(m) for b,m in zip(banana, monkey)]
>>> print(bananasplit)
[9, 4, 12]

就您的原始代码而言,主要问题在于以下部分实际上是无操作的:

[int(i) for i in monkey]
[int(i) for i in banana]
为了让它们变得有用,你需要将结果分配到某个地方,例如:

Translated: 为了让它们变得有用,你需要将结果分配到某个地方,例如:

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

值得注意的是,根据Python版本不同,使用/进行整数除法可能会截断结果或返回浮点数结果。详见In Python 2, what is the difference between '/' and '//' when used for division?


1
你的例子简洁明了,但有一点需要注意:你不需要使用 strip(),因为 int() 不会受到它的影响。 - Thorsten Kranz
我有 q = [[7,2,3],[4,5,6]]r=[[6,1,2],[3,4,5]]。我需要将对应元素相除。B= [[float(j)/float(i) for j in q] for i in r]。然而,我一直收到一个错误:TypeError: float() argument must be a string or a number。我已经从future中导入了division。有什么建议吗? - Rspacer
@Biotechgeek 由于q和r是嵌套列表(列表的每个元素都是一个列表),因此你的“j”和“i”是列表,而不是值。为了做到我认为你想做的事情,你必须像这样做:B = [[float(jj)/float(ii) for jj, ii in zip(i, j)] for i,j in zip(q,r)]。这将产生一个包含两个列表的列表,每个列表都有三个元素:[[1.1666666666666667, 2.0, 1.5], [1.3333333333333333, 1.25, 1.2]] - Arthur Dent

2
尝试像这样做。
bananasplit = [x/y for x, y in zip(map(int, banana), map(int, monkey))]

如果你想得到浮点数的结果(在Python 2.x中),你可以将整数更改为浮点数,或使用 from __future__ import division

+1 对于如此简洁明了的表述,-1 对于如此简洁明了的表述,不带任何评论。您认为发帖者能够理解吗? - 9000
1
@9000 在我发布后回来添加细节时,NPE的回答已经涵盖了所有内容 - 没有必要重复所有内容。如果有人错过了那个答案,我会把它留作一个需要自己解决的练习 :P - DanielB
1
zip 之前对 int 进行 map 映射,会使列表推导式的表现力减半。如果你想以这种方式做事情,那么你可以使用 map(int.__div__, map(int, banana), map(int, monkey)) 或类似的方法。至少这样你就可以利用 map 内置的隐式压缩功能了。或者,你也可以使用 map(lambda b, m: int(b) / int(m), banana, monkey) - Karl Knechtel
@DanielB:我明白了。我只是想提醒一下,考虑到提问者的知识水平,一个神奇的咒语(或者对于没有经验的人来说看起来像咒语)可能不如解释事物的工作原理有帮助。你能想象在你的代码库中添加一个可以工作但你不知道为什么和如何工作的片段吗? - 9000

1
列表迭代和映射函数可以让你快速到达目的地。
>>> 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]

>>> 

0
一个列表推导式,比如[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函数,它接受两个列表并生成一对列表。

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

当然,您可以使用更短的标识符;我使用长名称是为了更容易理解它们的作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接