Python:比较两个列表并获取带符号的最大值和最小值

5
我有两个列表,一个包含最大值,另一个包含最小值:
list_max = [
    [100, 10, 100],
    [-50, 90, -50]
    ]
list_min = [
    [50, -90, -50],
    [-100, -10, -500]
    ]

我希望获得每个相关项目的最大绝对值及其符号的第三个列表,即:
list_max[0][0] = 100; list_min[0][0] = 50  -> list_3[0][0] = 100
list_max[0][1] = 10;  list_min[0][1] = -90 -> list_3[0][1] = -90

list_3 = [
    [100, -90, 100],
    [-100, 90, -500]
]

也许可以用pandas吗?
4个回答

10

你不需要使用pandas:

list_3 = [
    [max((x, y), key=abs) for x, y in zip(line_max, line_min)]
    for line_max, line_min in zip(list_max, list_min)
]

关键是使用zip和使用abs作为 max的键函数。

如果绝对值相等(例如,-5050),此解决方案将优先选择正数值(因为abs会获取第一个最大值)。如果需要相反的结果,请在调用max时交换xy


4

正如L3viathan所示,你不需要使用pandas。但是仅供参考,使用pandas可以做到:

import pandas as pd

list_max = pd.DataFrame([
    [100, 10, 100],
    [-50, 90, -50]
])
list_min = pd.DataFrame([
    [50, -90, -50],
    [-100, -10, -500]
])

list_3 = list_max.where(abs(list_max) > abs(list_min), list_min)

所有的答案都很好。我选择了你的,因为它更适合我一些。 - PedroBiel

3

numpy一行代码:

import numpy as np

In [1023]: list_max = np.array([
      ...:     [100, 10, 100],
      ...:     [-50, 90, -50]
      ...:     ])
      ...: list_min = np.array([
      ...:     [50, -90, -50],
      ...:     [-100, -10, -500]
      ...:     ])
      ...:     

In [1024]: np.where(np.abs(list_max) > np.abs(list_min), list_max, list_min)
Out[1024]: 
array([[ 100,  -90,  100],
       [-100,   90, -500]])

2

list_max和list_min中的列表长度总是相同吗?list_max和list_min的长度总是相同吗?

如果是这样,您可以使用索引i循环遍历list_max(或list_min),并使用索引j循环遍历list_max中的列表,为每个ij找到最大绝对值。

最初的回答:

list_3 = []

# Loop through lists in list_max
for i in range(len(list_max)):
    temp_list = []
    # Loop through items in each list in list_max
    for j in range(len(list_max[i])):
        list_max_val = list_max[i][j]
        list_min_val = list_min[i][j]
        final_val = list_max_val if abs(list_max_val) > abs(list_min_val) else list_min_val

        # Add value to temporary list
        temp_list.append(final_val)
    # Add the temporary list to list_3
    list_3.append(temp_list)

编辑:由于我错过了保留值符号的指示,因此不得不进行修改。

最初的回答:


L3viathan的答案更符合Pythonic风格。 - Jeremy H

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