Python:查找一个列表中最大值和索引,该列表包含多个嵌套的列表

3
我有一个Python的列表嵌套列表嵌套列表,它看起来像这样:
my_list = [ [[1,2,3],[4,3,2]] , [[2,1,9],[8,1,2]] , [[5,4,3],[1,6,7]] , ...]

想要获取列表中最大值及其三个索引。
我已经看到如何对列表中的列表执行此操作:
max_value, max_index = max((x, (i, j))
                           for i, row in enumerate(my_list)
                           for j, x in enumerate(row))

但我不明白如何将其适应第三个列表。
另一个问题:是否有一种简单的方法可以将以下操作应用于我的所有列表元素?
my_list = my_list - my_list[0] * 2

1
对于你的第二个问题,请看一下map函数;它就是为了这个目的而设计的。 - Prune
4个回答

5

只是扩展概念吗?

max_value, max_index = max((x, (i, j, k))
                       for i, row in enumerate(my_list)
                       for j, col in enumerate(row))
                       for k, x in enumerate(col))

针对您的第二个问题,可以看一下 map 函数;它就是专门为此而设计的。

map(lambda x: x - my_list[0] - 2, my_list)

例子:

>>> my_list = [5, 20, 22, 13, 8, 1000]
>>> map(lambda x: x - my_list[0] * 2, my_list)
[-5, 10, 12, 3, -2, 990]

4

为什么不使用numpy

import numpy as np

lst = [[[1,2,3],[4,3,2]] , [[2,1,9],[8,1,2]] , [[5,4,3],[1,6,7]]]

a = np.array(lst)                       # Create numpy array from list

>>> a
Out[]:
array([[[1, 2, 3],
        [4, 3, 2]],

       [[2, 1, 9],
        [8, 1, 2]],

       [[5, 4, 3],
        [1, 6, 7]]])

>>> a.tolist()                          # And convert back to list if needed
Out[]: [[[1, 2, 3], [4, 3, 2]], [[2, 1, 9], [8, 1, 2]], [[5, 4, 3], [1, 6, 7]]]

>>> a.tolist() == lst
Out[]: True

使用以下方法获取最大值的索引:

>>> np.argwhere(a == a.max())           # Indices where a is maximum
Out[]: array([[1, 0, 2]], dtype=int64)

并使用以下操作:

a -= a[0] * 2                           # Apply operation inplace

>>> a
Out[]:
array([[[-1, -2, -3],
        [-4, -3, -2]],

       [[ 0, -3,  3],
        [ 0, -5, -2]],

       [[ 3,  0, -3],
        [-7,  0,  3]]])

2

因此,我为第一个问题设计的解决方案首先从3D列表中的每一行中找到最大列表:

my_max_list =  map(max, my_list)

然后将您在列表中查找最大元素的原始解决方案应用于列表中的列表

max_value, max_index = max((x, (i, j))
                       for i, row in enumerate(my_max_list)
                       for j, x in enumerate(row)) 

对于第二个问题,您可以使用map函数。

map(lambda x: x - my_list[0] * 2, my_list)

0
你可以尝试这个:
my_list = [ [[1,2,3],[4,3,2]] , [[2,1,9],[8,1,2]] , [[5,4,3],[1,6,7]]]
maximum, the_index = [(a, i) for i, a in enumerate(my_list) if a == max(my_list)][0]
new_list = [[[c-b[0]*2 for c in b] for b in i] for i in my_list]

你的算法现在是二次的,因为你在循环中不断计算 max(my_list)... - juanpa.arrivillaga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接