Python:遍历列表并存储每个索引最大值的最佳方法

-2 投票
2 回答
95 浏览
提问于 2025-04-12 20:52

在Python(3.8)中,我有15个长度相同的列表。

每个列表里都包含浮点数。

为了举例说明我的问题,我假装有3个长度为5的列表:

List1 = [29.561801, 29.564141, 29.566480, 29.293966, 29.291252]
List2 = [26.602566, 22.752335, 22.755249, 22.754278, 22.756220]
List3 = [23.966560, 23.960471, 23.954381, 29.568819, 29.571159]

对于每个索引,我想找出哪个列表的值最大。然后把结果存储到一个新的列表里。根据我上面的3个示例列表,输出结果会是:

Result=[1, 1, 1, 3, 3]

现在我有以下代码来实现这个功能。它能工作,但感觉非常繁琐(尤其是因为我实际上有15个列表,而不是3个!)。

maxValue = 0
listWithMaxValue=0
Result=[]
for i in range(len(List1)):
    maxValue=List1[i]
    listWithMaxValue=1
    if(List2[i] > maxValue):
        maxValue=List2[i]
        listWithMaxValue=2
    if(List3[i] > maxValue):
        maxValue=List3[i]
        listWithMaxValue=3
    Result=np.append(Result, listWithMaxValue)

我觉得应该有更好的方法来实现同样的结果,而不需要重复15次相同的“if”循环?

2 个回答

3

把你所有的列表放到一个大列表里。这样你就可以用 zip 来管理这些小列表,就像管理“列”一样。

示例代码如下:

List1 = [29.561801, 29.564141, 29.566480, 29.293966, 29.291252]
List2 = [26.602566, 22.752335, 22.755249, 22.754278, 22.756220]
List3 = [23.966560, 23.960471, 23.954381, 29.568819, 29.571159]

lists = [List1, List2, List3]

result = [c.index(max(c))+1 for c in zip(*lists)]

print(result)

输出结果:

[1, 1, 1, 3, 3]

注意:

在 Python 中,列表的索引是从 0 开始的,但这里的要求似乎是从 1 开始计数,所以需要做一些调整。

2

有了变量 List1List2List3(还有其他的变量),这确实会让事情变得复杂。你应该只用一个数组,然后通过它的索引来循环处理。这样后面的操作就会简单很多。

floats = [
  [1.0] * 7,
  [2.0] * 7,
  [3.0] * 7,
  [4.0] * 7,
  [17.42] * 7,
  [6.0] * 7,
  [0.1, 12.2, 27.3, 18.4, 496.5, 7.6, 1.7]]

maxidx = []

for i in range(len(floats[0])):
    maxx = floats[0][i]
    maxi = 0
    for x in range(len(floats)):
        f = floats[x][i]
        if f > maxx:
            maxx = f
            maxi = x
    maxidx.append(maxi)

这段代码会在出现平局的情况下提取出编号最小的索引。

为了简化,这里只用了7个长度为7的列表;但逻辑是可以扩展到任何维度的,这一点应该很明显。

因为Python中的变量总是引用,所以如果你觉得重构现有代码会有点麻烦,你其实可以把外层数组构建成指向你现有变量的引用列表。

floats = [List1, List2, List3, ...]

在Python中,数组的索引是从零开始的,所以结果中的索引0代表的是 List1

撰写回答