在嵌套列表中使用max或min by index获取一个结果列表

时间:2017-07-20 00:42:23

标签: python list-comprehension

让我说我有这个结构

[[[1,2],[3,4]],[[8,9],[7,7]]]

我想迭代列表并得到这个结果:

[[3,2],[8,7]]

这会将第一级[[1,2],[3,4]]中的数组列表列表减少为一个单独的数组,其中为第一个元素选择最大值,为第二个元素找到最小值。

我已经手动完成了它,只是迭代组,再次迭代,存储第一个值并查看下一个是更大还是更小,我将它存储在列表中并创建另一个列表。

我想找到一个更优雅的方法,列表推导等等,我很确定我可以在这里使用zip将值组合在同一组中,但到目前为止我还没有成功

2 个答案:

答案 0 :(得分:1)

这将无拉链工作:

{{1}}

这样做的主要缺点是它会查看每个子列表两次,一次查找最大值(第一项)和一次查找最小值(第二项)。

答案 1 :(得分:1)

您可以使用zip,通过将结果解压缩为单个值,您可以轻松地完成所需的操作,例如:

>>> x = [[[1,2],[3,4]],[[8,9],[7,7]]]
>>> [[max(a), min(b)] for k in x for a, b in [zip(*k)]]
[[3, 2], [8, 7]]

没有解压缩的替代方法是使循环函数可迭代(max, min, max, min, ...)并使用嵌套列表推导,例如:

>>> import itertools as it
>>> maxmin = it.cycle([max, min])
>>> [[next(maxmin)(a) for a in zip(*k)] for k in x]
[[3, 2], [8, 7]]

或索引到函数列表:

>>> import itertools as it
>>> maxmin = [max, min]
>>> [[maxmin[i](a) for i, a in enumerate(zip(*k))] for k in x]
[[3, 2], [8, 7]]