如何在Python 3中划分列表清单?

时间:2018-06-21 20:13:49

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

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中的每个元素划分吗?

输出应再次位于列表列表中。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

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

这实际上是zipwith中的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!

诚然,这比罪恶丑陋。但这使我的小心脏无法正常工作。

答案 2 :(得分:0)

您可以使用内置功能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]]