【问题标题】:Finding max and min indices in lists in Python在 Python 中的列表中查找最大和最小索引
【发布时间】:2017-10-15 20:55:48
【问题描述】:

我有一个看起来像这样的列表:

trial_lst = [0.5, 3, 6, 40, 90, 130.8, 129, 111, 8, 9, 0.01, 9, 40, 90, 130.1, 112, 108, 90, 77, 68, 0.9, 8, 40, 90, 92, 130.4]

该列表代表一系列实验,每个实验都有一个最小值和一个最大值。例如,在上面的列表中,最小值和最大值如下:

Experiment 1:
Min: 0.5
Max: 130.8

Experiment 2:
Min: 0.01
Max: 130.1

Experiment 3:
Min: 0.9
Max: 103.4

我获得了上述每个实验的值,因为我知道每个 实验从 0 左右开始(例如 0.4、0.001、0.009 等),在 130 左右结束(130、131.2、130.009 等)。你可以想象一个喷嘴打开和关闭。当它打开时,压力上升,当它关闭时,压力下降。我正在尝试计算每个实验的最小值和最大值。

到目前为止,我尝试的是遍历列表以首先将每个索引标记为最大值,但我似乎无法做到这一点。

这是我的代码。关于如何更改它的任何建议?

for idx, item in enumerate(trial_lst):
    if idx > 0:
        prev = trial_lst[idx-1]
        curr = item
        if prev > curr:
            result.append((curr, "max"))
        else:
            result.append((curr, ""))

我正在寻找一种手动方式来执行此操作,没有库。

【问题讨论】:

  • max((a,i) for (i,a) in enumerate(trial_lst)) 和 min((a,i) for (i,a) in enumerate(trial_lst)) 将为您提供最大/最小值及其索引,但我看不出这些实验是如何相关的。
  • 感谢您的建议,但这只会返回最小值及其索引
  • 您的问题标题与您的要求不符。另外,您列表中不同实验的面额在哪里???
  • 有点不清楚你在问什么。是否要以某种方式拆分试用列表?
  • 请准确解释您是如何获得实验 1、2 和 3 的值的。

标签: python list max


【解决方案1】:

使用最简单的方法(首先对列表或数组进行排序):

trial_lst = [0.5, 3, 6, 40, 90, 130.8, 129, 111, 8, 9, 0.01, 9, 40, 90, 130.1, 112, 108, 90, 77, 68, 0.9, 8, 40, 90, 92, 130.4]

trial_lst.sort(key=float)

for count, items in enumerate(trial_lst):

    counter = count + 1
    last_object = (counter, trial_lst[count], trial_lst[(len(trial_lst)-1) - count])

    print( last_object )

【讨论】:

  • 这是不正确的。它不保持最大值的顺序。例如,它将第一个周期的最大值打印为 130.4 而不是 130.8
  • @Dunes :大声笑...因为 0.01!我没看到,没问题,只需将 key=int 更改为 key=float!
【解决方案2】:

您可以使用以下方法轻松获取最小值的索引:

my_list.index(min(my_list))

【讨论】:

  • 谢谢,但这只会返回最小值。我希望为每个实验返回多个最大值和最小值。实验从 0 开始到 130 左右结束,所以我试图找出一种通过比较每个元素来计算最大值和最小值的方法..但无济于事。
  • “多个最大值和最小值”是什么意思?
  • 我的意思是该列表由多个实验组成。每个都有一个最小值和一个最大值。
【解决方案3】:

这是一个交互式演示,可能会有所帮助:

>>> trial_lst = [0.5, 3, 6, 40, 90, 130.8, 129, 111, 8, 9, 0.01, 9, 40, 90, 130.1, 112, 108, 90, 77, 68, 0.9, 8, 40, 90, 92, 130.4]

使用小于 1 的值来确定一个实验在哪里结束,另一个实验从哪里开始

>>> indices = [x[0] for x in enumerate(map(lambda x:x<1, trial_lst)) if x[1]]

将列表分解为这些值的子列表

>>> sublists = [trial_lst[i:j] for i,j in zip([0]+indices, indices+[None])[1:]]

计算每个子列表的最大值/最小值

>>> for i,l in enumerate(sublists):
...     print "Experiment", i+1
...     print "Min", min(l)
...     print "Max", max(l)
...     print
... 
Experiment 1
Min 0.5
Max 130.8

Experiment 2
Min 0.01
Max 130.1

Experiment 3
Min 0.9
Max 130.4

【讨论】:

  • 我没想过把它分成子列表。这真的很有帮助,谢谢!
猜你喜欢
  • 2021-04-20
  • 1970-01-01
  • 2012-07-16
  • 2020-12-05
  • 2013-06-01
  • 2019-03-17
  • 2021-10-07
  • 2013-01-11
  • 1970-01-01
相关资源
最近更新 更多