Pra*_*are 4 c# ruby python sorting haskell
我有一份清单清单.
List<List<T>> li = {
{a1,a2,a3 ... aN},
{b1,b2,b3 ... bN},
...
};
double foo(List<T> list)
{
// do something
// e.g {1,2,3}
// it = 1 + 2 + 3
return it;
}
Run Code Online (Sandbox Code Playgroud)
现在我想以li这样一种方式排序,即它应该出现在排序列表中foo(x)的x更高位置.
C#/ Python /其他任何一种方法的最佳方法是什么?
Hen*_*man 10
有一点LINQ:
var q = from el in li
orderby foo(el)
select el;
li = q.ToList();
Run Code Online (Sandbox Code Playgroud)
Gre*_*con 10
使用onData.Function 的组合器,Haskell解决方案特别优雅.
import Data.Function (on)
import Data.List (sortBy)
lists = [ [ 5, 6, 8 ]
, [ 1, 2, 3 ]
]
main = do
print $ sortBy (compare `on` foo) lists
where
foo = sum
Run Code Online (Sandbox Code Playgroud)
输出:
[[1,2,3],[5,6,8]]
还有comparingData.Ord让我们改写
main = do
print $ sortBy (comparing foo) lists
where
foo = sum
Run Code Online (Sandbox Code Playgroud)
该定义comparing是一个简单的
comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering
comparing p x y = compare (p x) (p y)
Run Code Online (Sandbox Code Playgroud)
但我们也可以用以下方面来定义它on:
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering
comparing f = compare `on` f
Run Code Online (Sandbox Code Playgroud)
或完全没有点
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering
comparing = (compare `on`)
Run Code Online (Sandbox Code Playgroud)
Haskell操作函数与Perl操纵字符串一样强大.
这是Python方式:只需将函数作为key参数传递给sorted()或.sort():
>>> mylist = [123, 765, 4, 13]
>>> def mod5(x):
... return x%5
...
>>> sorted(mylist, key = mod5)
[765, 123, 13, 4]
>>> sorted(mylist, key = mod5, reverse = True)
[4, 123, 13, 765]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
649 次 |
| 最近记录: |