按列表列表中的索引计算最小值或最大值


list_of_elements = [1255, 1256, 1257, 1258, 1259]
print(components[1255],components[1256],components[1257],components[1258],components[1259])

打印的输出为:

[481, 498, 5142, 5157] [481, 497, 5192, 5199] [481, 498, 5219, 5238] [481, 484, 5239, 5242] [481, 487, 5269, 5271)]

我想做的是取第一个索引(0(的最小数,第二个索引的最大数,第三个索引的最小数和第四个索引的最大数,因此在这种情况下,我将得到:

[481,498,5142,5271]

所以,再一次,基本上我会得到一个元素列表(在这种情况下它是list_of_elements,可能有 0 个值到未知(,然后我必须将该列表的元素作为字典中的键输入components并执行上述步骤。

这是通过调度程序字典和几个列表推导来构建逻辑的一种方法:

list_of_elements = [1255, 1256, 1257, 1258, 1259]
# extract data via list comprehension
L = [components[i] for i in list_of_elements]
# defined explicitly for demonstration
L = [[481, 498, 5142, 5157], [481, 497, 5192, 5199],
[481, 498, 5219, 5238], [481, 484, 5239, 5242],
[481, 487, 5269, 5271]]
from operator import itemgetter
# define dispatcher dictionary
funcs = {0: min, 1: max}
# apply via list comprehension
res = [funcs[i%2](map(itemgetter(i), L)) for i in range(len(L[0]))]
print(res)
[481, 498, 5142, 5271]

解释

  • i%2返回 0 或 1,具体取决于索引是偶数还是奇数。
  • funcs[i%2]返回funcs字典中定义的minmax
  • map(itemgetter(i), L)L内每个列表的第i个元素上返回一个迭代器。
  • 在此迭代器上应用funcs[i%2]将返回最小值或最大值。

此解决方案使用三元语句,并在列表推导式中使用enumerate+zip

L = [[481, 498, 5142, 5157], [481, 497, 5192, 5199],
[481, 498, 5219, 5238], [481, 484, 5239, 5242],
[481, 487, 5269, 5271]]
res = [(min if not i%2 else max)(j) for i, j in enumerate(zip(*L))]
print(res)
[481, 498, 5142, 5271]

最新更新