如何排序此列表?

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)

  • `orderby foo(el)降序 (3认同)
  • li.OrderByDescending(elem => foo(elem)).ToList() (2认同)

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操纵字符串一样强大.

  • 或者使用`sortWith`:http://www.haskell.org/ghc/docs/latest/html/libraries/base/GHC-Exts.html#v%3AsortWith (2认同)

bal*_*pha 5

这是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)