从列表列表中按最后一个元素选择最大值的最佳方法是什么?

xzh*_*zhu 7 wolfram-mathematica

在Mathematica中,Max[]获取数字列表中的最大数字是最有效的函数,但是如何在列表列表中找到具有最大最后一个元素的列表?例如,x在一系列坐标中具有最大部分的2-d 坐标.

我最好的尝试是SortBy,但显然我不需要程序来排序我的列表,只需要我需要的最大值.

Dr.*_*ius 6

也许:

list = {{4, 3}, {5, 10}, {-2, 1}, {3, 7}}

Reverse /@ Take[#, Ordering[#, -1]] &@(Reverse /@ #) &@ list
(*
-> {{5, 10}}
*)
Run Code Online (Sandbox Code Playgroud)

Ordering[ ]通过第一个元素利用订单列表的事实

编辑

或者更好(我认为):

Take[#, Ordering[Last /@ #, -1]] &@ list
Run Code Online (Sandbox Code Playgroud)

编辑

也:

#[[Ordering[#, -1, Last@#2 > Last@#1 &]]] &@list
Run Code Online (Sandbox Code Playgroud)

编辑

也许更快:

#[[First@Position[#, Max@#] &@(Last /@ #)]] &@list
Run Code Online (Sandbox Code Playgroud)


xzh*_*zhu 1

在阅读了一些文档并做了一些实验之后,我对这个问题有了更清晰的认识。

\n\n

我其实想知道为什么Max[]似乎故意避免提供使其不仅返回最大元素本身,而且返回其位置的指令。毕竟,提供位置不会改变算法的 O(n) 复杂度。例如,想象一下:

\n\n
In[1]:= Max[{991, 993, 992}, ReturnPosition -> True]\n\nOut[1]= {2}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果可以的话,您可以简单地使用下面的代码来解决我的问题:

\n\n
list[[Max[list[[All, -1]], ReturnPosition -> True]]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

但现在我意识到系统函数Max[]并不是为查找列表中的最大元素而设计。您可以看出,Wolfram 团队显然更像数学中的传统函数 \xe2\x80\x95 它进行了简单的符号简化,它自动展平所有列表,它可以在可绘制函数中,最重要的是,它\' sMax[]maxOrderless

\n\n
In[2]:= Attributes[Max]\n\nOut[2]= {Flat, NumericFunction, OneIdentity, Orderless, Protected}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这使得职位毫无意义。总之,它将里面的所有列表视为数学集合。

\n\n

所以从哲学上来说,Mathematica 计算这个并不是微不足道的。我需要做的就是“DIY”一个复杂度为 O(n) 的函数并且可以完成这项工作。我认为 TomD 正在朝着正确的方向前进,尽管我更喜欢:

\n\n
maxLast[l_] := Cases[l, {___, Max[Last/@l]}]\n
Run Code Online (Sandbox Code Playgroud)\n\n

而Heike(\xe9\xbb\x91\xe5\xae\xa2?)采用的Pick可能有更好的专门为选择元素而设计的技术,但算法的复杂度一定没有实质上的差异。我可能会这样重写:(更少的名字和头,更快的速度)

\n\n
maxLast[l_] := Pick[l, #, Max[#]] &[Last /@ l]\n
Run Code Online (Sandbox Code Playgroud)\n\n

它们都是很好的答案。

\n