通过嵌套列表中元素的索引找到最小值和最大值

3

我有一个嵌套列表,形如以下:

x = [[1,  5, 3,  4], 
     [5, 10, 7,  8], 
     [9,  9, 2, 12]]

我需要找到嵌套列表转置的最小值和最大值,使得最小值结果为:

1, 5, 2, 4  # 1 is the min of first column (1, 5, 9) a.s.o

最大值应为:

9, 10, 7, 12

我试着先将它转换为dataframe,然后在不同的轴上进行最大值和最小值的操作,但结果并不是我想要的。


2
min 中的 4max 中的 97 是从哪里来的?为什么嵌套列表只有 3 个,结果中却有 4 个值? - Ma0
z = [min(i) for i in x] 给出了包含所有最小值的列表,而 z = [max(i) fro i in x] 则给出了相反的结果! - Ubdus Samad
3个回答

7
你可以使用内置的 mapminmax 函数和 zip(*...) 转置模式,来实现以下操作:
min_x = list(map(min, zip(*x)))
max_x = list(map(max, zip(*x)))

正如Chris_Rands所指出的那样,这个缩写形式也可以正常工作:

min_x = list(map(min, *x))
max_x = list(map(max, *x))

或者使用推导式:

min_x = [min(col) for col in zip(*x)]
max_x = [max(col) for col in zip(*x)]

如果您非常想要一行完成它:
min_x, max_x = zip(*[(min(col), max(col)) for col in zip(*x)])

1
list(map(min, *x)) - Chris_Rands
2
90%的时候,一个问题最难的部分是理解它,而不是实际的编码困难。干得好!+1 - Ma0

1
你可以使用列表推导式或其他方式:
print([min(item) for item in zip(*x)])

是等同于:

min_list=[]
for i in zip(*x):
    min_list.append(min(i))
print(min_list)

输出:

[1, 5, 2, 4]

给Max:

print([max(item) for item in zip(*x)])

is same as:

max_list=[]
for i in zip(*x):
    max_list.append(max(i))

print(max_list)

输出:

[9, 10, 7, 12]

1

仅需使用numpy模块:

import numpy as np

x = np.array([[1,  5, 3,  4], [5, 10, 7,  8], [9,  9, 2, 12]])
print(np.min(x, 0))    # [1 5 2 4]
print(np.max(x, 0))    # [ 9 10  7 12]

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