Python:遍历列表并存储每个索引最大值的最佳方法
在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
有了变量 List1
、List2
、List3
(还有其他的变量),这确实会让事情变得复杂。你应该只用一个数组,然后通过它的索引来循环处理。这样后面的操作就会简单很多。
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
。