繁体   English   中英

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

[英]Python: Compare two lists and get max and min values with signs

我有两个列表列表。 一个具有最大值,另一个具有最小值:

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

也许和熊猫一起?

你不需要熊猫:

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

技巧是zipmax的是关键功能abs

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

正如L3viathan所示,你不需要大熊猫。 但仅供参考,大熊猫你可以做到:

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)

list_max和list_min中的列表总是具有相同的长度吗? list_max和list_min的长度是否一致?

如果是这样,你可以遍历list_max(或list_min)与索引i和遍历列表list_max内的索引j ,寻找最大绝对值为每个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)

编辑:不得不修改这个,因为我错过了保持值的符号的指令

numpy one-liner:

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

暂无
暂无

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

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