按索引创建嵌套列表的最小值列表
Creating a list of the minimum values of a nested list by index
我有一系列相同长度的嵌套列表(列表的数量不同):
list1=[[5.5,4,6.21,3.4,8.1,3.8],[3.8,2.1,5.1,4,12.3,2.4],[4,2.11,8.2,3.6,4.5,2]]
我正在尝试创建每个列表的每个索引的最小数字列表,即
list2=[3.8,2.1,5.1,3.4,4.5,2]
真的不确定从哪里开始,除了答案是列表理解或 for 循环...
编辑(整理我的困惑);
list2 = []
for i in range(len(list1[0])):
list2.append(min([list1[j][i] for j in range(len(list1))]))
尝试:
list2 = [min(i) for i in list1]
其中 min(i)
returns i
中的最低值,在本例中是一个列表。
在 for loop
术语中:
list2 = []
for sublist in list1:
list2.append(min(sublist))
您甚至可以使用 min()
函数的实现单独计算最小值,但既然它在那里,我将使用它。
list2 = []
for sub in list1:
lowest = sub[0]
for item in sub:
if item < lowest:
lowest = item
list2.append(lowest)
使用numpy的min函数
import numpy as np
list2 = np.min(list1,axis=0)
您可以将 map
与 min
+ zip
一起使用:
res = list(map(min, zip(*list1)))
或者,使用列表理解:
res = [min(i) for i in zip(*L)]
对于较大的列表,这些方法的性能相当:
L = list1*100000
%timeit list(map(min, zip(*L))) # 110 ms per loop
%timeit [min(i) for i in zip(*L)] # 123 ms per loop
我使用 for
循环发布了更通用的解决方案。另一个答案在生产环境中更好,但对某些人来说可能更具教育意义:
list=[[2,3,4,5],[3,4,5,1],[4,5,1,6]]
result = list[0]
for i in range(1, len(list)):
for j in range(0, len(list[1])):
if list[i][j] < result[j]:
result[j] = list[i][j]
print(result)
我有一系列相同长度的嵌套列表(列表的数量不同):
list1=[[5.5,4,6.21,3.4,8.1,3.8],[3.8,2.1,5.1,4,12.3,2.4],[4,2.11,8.2,3.6,4.5,2]]
我正在尝试创建每个列表的每个索引的最小数字列表,即
list2=[3.8,2.1,5.1,3.4,4.5,2]
真的不确定从哪里开始,除了答案是列表理解或 for 循环...
编辑(整理我的困惑);
list2 = []
for i in range(len(list1[0])):
list2.append(min([list1[j][i] for j in range(len(list1))]))
尝试:
list2 = [min(i) for i in list1]
其中 min(i)
returns i
中的最低值,在本例中是一个列表。
在 for loop
术语中:
list2 = []
for sublist in list1:
list2.append(min(sublist))
您甚至可以使用 min()
函数的实现单独计算最小值,但既然它在那里,我将使用它。
list2 = []
for sub in list1:
lowest = sub[0]
for item in sub:
if item < lowest:
lowest = item
list2.append(lowest)
使用numpy的min函数
import numpy as np
list2 = np.min(list1,axis=0)
您可以将 map
与 min
+ zip
一起使用:
res = list(map(min, zip(*list1)))
或者,使用列表理解:
res = [min(i) for i in zip(*L)]
对于较大的列表,这些方法的性能相当:
L = list1*100000
%timeit list(map(min, zip(*L))) # 110 ms per loop
%timeit [min(i) for i in zip(*L)] # 123 ms per loop
我使用 for
循环发布了更通用的解决方案。另一个答案在生产环境中更好,但对某些人来说可能更具教育意义:
list=[[2,3,4,5],[3,4,5,1],[4,5,1,6]]
result = list[0]
for i in range(1, len(list)):
for j in range(0, len(list[1])):
if list[i][j] < result[j]:
result[j] = list[i][j]
print(result)