【问题标题】:Divide one list by another list将一个列表除以另一个列表
【发布时间】:2013-01-21 08:09:29
【问题描述】:

我有两个这样的列表:

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 循环,但无法正确处理。这是我所做的:

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

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

【问题讨论】:

    标签: python list divide


    【解决方案1】:

    下面会做:

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

    要将它们变成有用的东西,您需要将结果分配到某处,例如:

    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?

    【讨论】:

    • 你的例子很好,切中要害,但要说一句:你不需要strip(),因为int() 不关心它。
    • @ThorstenKranz:谢谢,我不知道。我已经更新了答案。
    • 我有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() 参数必须是字符串或数字。我从未来导入了师。有什么建议吗?
    • @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]]
    【解决方案2】:

    试试这样的。

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

    如果您想要float 结果(在python 2.x 中),您可以将ints 更改为floatfrom __future__ import division

    【讨论】:

    • +1 表示简洁,-1 表示简洁,并且没有任何 cmets。你觉得发帖人能跟得上吗?
    • @9000 到我发帖的时候再回来补充细节 NPE 的答案已经涵盖了所有内容 - 觉得没有必要重复所有内容。如果有人错过了这个答案,我会把它作为一个练习来解决:P
    • mapping 在int 之前zip 缺少列表理解的一半表达能力。如果你想那样做,你还不如全力以赴 map(int.__div__, map(int, banana), map(int, monkey)) 什么的。至少那时您正在利用 map 内置的隐式压缩。 :P 或者,就此而言,map(lambda b, m: int(b) / int(m), banana, monkey)
    • @DanielB:我明白了。我只想注意到,鉴于从问题中可以明显看出张贴者的知识水平,一个神奇的咒语(或者对于未经训练的人来说看起来像一个咒语)可能比解释事情如何运作更有帮助。你能想象在你的代码库中添加一个可以工作但你不知道为什么以及如何工作的片段吗?
    【解决方案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)
      ]
      

      当然,您可以随意使用较短的标识符;我使用长名称使他们的角色更容易理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多