【问题标题】:How to divide list of list in Python 3?如何在 Python 3 中划分列表列表?
【发布时间】:2018-06-21 20:13:49
【问题描述】:
list1 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
         [0, 500000.0, 500000.0, 500000.0], [0, 0, 1000000.0, 0],
         [0, 1000000.0, 500000.0, 2500000.0]]

list2 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
         [0, 1, 1, 1], [0, 0, 2, 0], [0, 2, 1, 4]]

我们可以将list1和list2中的每个元素分开吗?

输出应该再次出现在列表列表中。

【问题讨论】:

  • 试着更好地解释你想要达到的目标,你的意思是什么?
  • 在 list1 和 list2 中有列表。我想划分每个 list1[0] / list2[0]
  • 尝试使用 numpy。
  • 所以结果应该类似于list3 = [[ZeroDivisionError, ZeroDivisionError, ZeroDivisionError, ZeroDivisionError], [ZeroDivisionError, ...], ...]?
  • @Aran-Fey 当然数据不正确。但是是的。

标签: python python-3.x list list-comprehension


【解决方案1】:

这通常称为zipwith。 Python 没有内置函数来执行此操作,但使用列表推导式很容易构建自己。

[f(a, b) for a, b in zip(list1, list2)]  # where f is the function to zip with!

不过,这实际上是zipwiths 中的zipwith,所以让我们嵌套吧:

[[aa/bb for (aa, bb) in zip(a, b)] for (a, b) in zip(list1, list2)]

编辑:正如 Aran-Fey 指出的那样,zipwith 确实在 Python 中以 map 的形式存在,这使得:

import functools
import operator

zipwithdiv = functools.partial(map, functools.partial(map, operator.truediv))

zipwithdiv(list1, list2)  # magic!

诚然,这比罪恶更丑陋。但它让我小小的功能性心脏变得砰砰作响。

【讨论】:

  • psst:“zipwith”就是map。 (是的,它支持多个迭代)
  • @Aran-Fey ooooooooooooooooooooooooooooooooooohh brb.
  • @Aran-Fey 你让我成为一个非常快乐的人,如果可能鼓励我使用稍微少一点的 Pythonic 代码 ;)
【解决方案2】:

IIUC

import numpy as np
>>> np.array(list1)/list2
array([[    nan,     nan,     nan,     nan],
       [    nan,     nan,     nan,     nan],
       [    nan,     nan,     nan,     nan],
       [    nan,     nan,     nan,     nan],
       [    nan, 500000., 500000., 500000.],
       [    nan,     nan, 500000.,     nan],
       [    nan, 500000., 500000., 625000.]])

【讨论】:

    【解决方案3】:

    您可以使用内置函数zip尝试以下操作:

    result = []
    for sub_list1, sub_list2 in zip(list1, list2):
        sub_list = []
        for a, b in zip(sub_list1, sub_list2):
            if b == 0:
                sub_list.append('DivisionByZero')
                continue
            sub_list.append(a / b)
        result.append(sub_list)
    

    这将产生:

    [['DivisionByZero', 'DivisionByZero', 'DivisionByZero', 'DivisionByZero'],
     ['DivisionByZero', 'DivisionByZero', 'DivisionByZero', 'DivisionByZero'],
     ['DivisionByZero', 'DivisionByZero', 'DivisionByZero', 'DivisionByZero'],
     ['DivisionByZero', 'DivisionByZero', 'DivisionByZero', 'DivisionByZero'],
     ['DivisionByZero', 500000.0, 500000.0, 500000.0],
     ['DivisionByZero', 'DivisionByZero', 500000.0, 'DivisionByZero'],
     ['DivisionByZero', 500000.0, 500000.0, 625000.0]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      相关资源
      最近更新 更多