我有一份清单。
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;
}
现在,我希望对li
进行排序,使foo(x)
更高的x
出现在排序列表中。
C#/ Python /其他任何内容的最佳方法是什么?
答案 0 :(得分:10)
一点点LINQ:
var q = from el in li
orderby foo(el)
select el;
li = q.ToList();
答案 1 :(得分:10)
使用Data.Function中的on
组合器,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
输出:
[[1,2,3],[5,6,8]]
还有来自Data.Ord的comparing
让我们改为写
main = do
print $ sortBy (comparing foo) lists
where
foo = sum
definition of comparing
是一个简单的
comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering
comparing p x y = compare (p x) (p y)
但我们也可以用on
:
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering
comparing f = compare `on` f
或完全没有点
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering
comparing = (compare `on`)
Haskell操作函数的功能与Perl操纵字符串一样强大。
答案 2 :(得分: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]
答案 3 :(得分:2)
红宝石:
mylist = [[1,2,3],
[3,5,9],
[1,1,1],
[10,23,14]]
sortedlist = mylist.sort {|a,b| b.inject {|sum, n| sum + n } <=> a.inject {|sum,n| sum + n}}
我不确定Code Golf的规则和我没有写foo方法,但总和很容易在foo中出现。
我的测试结果:
puts sortedlist.inspect
[[10,23,14],[3,5,9],[1,2,3],[1,1,1]]
答案 4 :(得分:2)
在Perl中,通常使用众所周知的Schwartzian transform来完成。
use List::Util qw(sum);
@li = map {$$_[0]} sort {$$a[1] <=> $$b[1]} map {[$_, sum(@$_)]} @li;
但重用Sort::Key会更好。
use List::Util qw(sum);
use Sort::Key qw(nkeysort);
@li = nkeysort {sum(@$_)} @li;
答案 5 :(得分:1)
还有其他语言吗?好的,这里有一些F#:
示例:按总和排序:
let foo = List.sum
let li = [[1;2];[42;1];[3;4]]
let result = li |> List.sortBy (fun el -> foo el)
结果(F#interactive):
val result : int list list = [[1; 2]; [3; 4]; [42; 1]]
Golfed:
let result = li |> List.sortBy (fun el -> foo el)
//shorter
let res = li |> List.sortBy foo
//evn shrtr
let r=List.sortBy foo li
C#版本:
var result = li.OrderBy(el=>el.Sum());
答案 6 :(得分:1)
:
-module (codegolfs).
-export ([sortmain/0]).
sortmain() ->
sort(
fun (SubList) -> lists:sum(SubList) end,
[ [1,2,3],[1,3],[2,5,6] ]).
% output: [[2,5,6],[1,2,3],[1,3]]
sort(Fun,List) ->
lists:sort( fun(A,B) -> Fun(A) < Fun(B) end,List ).
答案 7 :(得分:1)
Ruby(无耻地复制Beanish的输入数据):
list = [
[1, 2, 3],
[3, 5, 9],
[1, 1, 1],
[10, 23, 14]
]
p list.sort_by { |a| -a.inject(&:+) }
# => [[10, 23, 14], [3, 5, 9], [1, 2, 3], [1, 1, 1]]
答案 8 :(得分:1)
Clojure的:
(let [lst '((1 2 3) (3 5 9) (1 1 1) (10 23 14))]
(sort #(> (foo %1) (foo %2)) lst))
答案 9 :(得分:0)
您可以调整任何常用的排序例程来执行此操作。只需使用foo(x)进行比较而不是x。
答案 10 :(得分:0)
Tcl:
proc foo nums {tcl::mathop::+ {*}$nums}
set l {{1 2 3} {4 5 6} {3} {42 -40}}
lsort -command {apply {{a b} {expr {[foo $a] - [foo $b]}}}} $l
# => {42 -40} 3 {1 2 3} {4 5 6}