【问题标题】:Dividing list by list?按列表划分列表?
【发布时间】:2020-05-18 13:09:06
【问题描述】:

要将列表中的每个项目除以另一个列表中的项目,在同一个地方我有以下代码:

def calc_cosine(up_part, down_part):
    cosines = list(map(truediv, up_part, down_part))
    return cosines

向上部分:

[4.0, 4.0, 2.0, 5.0]

down_part:

[6.0, 8.94427190999916, 6.928203230275509, 7.348469228349535]

输出:

[0.6666666666666666, 0.4472135954999579, 0.2886751345948129, 0.6804138174397716]

但是,当我在烧瓶应用程序中使用此功能时,它会给出TypeError

是否有人知道一种方法将每个列表元素除以第二个列表中位于同一位置的元素,然后才使用for 循环?

【问题讨论】:

  • 您好 Arthur,请提供给定输入集的预期输出示例。这将有助于澄清您的问题。
  • 检查代码的缩进
  • @DavidFoster 抱歉,我添加了它。
  • 你能显示整个错误信息吗?尽管我没有在烧瓶中进行测试,但您的代码应该对我有用。

标签: python list for-loop typeerror


【解决方案1】:

您可以遍历其中一个列表的长度(在本例中为up_part),然后将它们除以第二个列表中的相应值:

def element_wise_division(up_part, down_part):
    output=[]
    for x in range(len(up_part)):
        output.append(up_part[x]/down_part[x])
    return output

这并不过分高效,但易于阅读和调试。请注意,如果down_partup_part 短,则会引发错误。

【讨论】:

    【解决方案2】:

    您可以将列表推导与zip 一起使用:

    def calc_cosine(up_part, down_part):
        return [u / d for u, d in zip(up_part, down_part)]
    

    【讨论】:

      【解决方案3】:

      您可以使用zip 配对列表的相同索引 - 对于长度不等的列表,将删除未配对的较长列表(在这种情况下使用itertools.zip_longest

      print(list(zip(up_part, down_part)))
      

      将打印

      [(4.0, 6.0), (4.0, 8.94427190999916), (2.0, 6.928203230275509), (5.0, 7.348469228349535)]
      

      完整代码:

      from operator import truediv 
      
      def calc_cosine(up_part, down_part):
          cosines=[]
          for data in zip(up_part, down_part):
              cosines.append(truediv(*data))
          return cosines
      
      up_part = [4.0, 4.0, 2.0, 5.0]
      down_part= [6.0, 8.94427190999916, 6.928203230275509, 7.348469228349535]
      
      print(calc_cosine(up_part, down_part))
      

      打印:

      [0.6666666666666666, 0.4472135954999579, 0.2886751345948129, 0.6804138174397716]
      

      或者简而言之:

      from operator import truediv 
      
      up_part = [4.0, 4.0, 2.0, 5.0]
      down_part= [6.0, 8.94427190999916, 6.928203230275509, 7.348469228349535]
      
      print([ truediv(*c) for c in zip(up_part, down_part)])
      

      【讨论】:

      • 知道为什么这会在他们的map 版本不起作用时起作用吗?
      • @Heap OP 尝试通过另一个列表来真实地划分一个列表。我从这些列表中创建一对数字(使用 zip)并将每一对输入 truediv。所以我除数,他们没有。
      • 不,OP 还将成对的数字输入 truediv。它有效:repl.it/repls/BasicEthicalCron
      • @Heap 但没有像他要求的那样使用 for 循环 - 用于调试目的。他的东西出错了,想要一个带有 for 循环的更易于调试的版本。
      • 啊,好的。这可能是一个很好的理由。他们没有提到可调试性,所以我有点忽略了 for 循环请求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多