简体   繁体   English

如何划分Python 3中的列表列表?

[英]How to divide list of list in Python 3?

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

Can we divide each element from list1 and list2? 我们可以从list1和list2中划分每个元素吗?

Output should again be in lists of list. 输出应该再次列在列表中。

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

This is commonly known as zipwith . 这通常称为zipwith Python doesn't have a builtin function to do this, but it's easy to build yourself with a list comprehension. Python没有内置函数来执行此操作,但使用列表解析可以轻松构建自己。

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

This is actually a zipwith of zipwith s, though, so let's nest: 这实际上是zipwithzipwith ,所以让我们窝:

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

EDIT: as Aran-Fey points out, zipwith does exist as map in Python, which makes this: 编辑:正如Aran-Fey指出的那样, zipwith 确实作为Python中的map存在,这使得:

import functools
import operator

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

zipwithdiv(list1, list2)  # magic!

which is, admittedly, uglier than sin. 诚然,这比罪恶更丑陋。 But it makes my little functional heart go a-pitter patter. 但它让我的小功能心脏变得笨拙。

You can try the following using the built-in function zip : 您可以使用内置函数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)

this will produce: 这将产生:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM