我需要按照这种格式对结构列表进行排序:(A, B, [...])
按列表的长度排序。
例如,如果我有:
[(A,B,[1,2,3,4]),(A,B,[1,2]),(A,B,[1,2,3,4,5]),(A,B,[1,2,3])]
排序后我想要这个:
[(A,B,[1,2]),(A,B,[1,2,3]),(A,B,[1,2,3,4]),(A,B,[1,2,3,4,5])]
我该怎么做?
答案 0 :(得分:4)
将每个元素El
映射到结构N-El
并使用内置的keysort/2
。
el_keyed(El,N-El) :-
El = (_,_,L),
length(L, N).
list_lulasorted(Els, ElsS) :-
maplist(el_keyed, Els, KVs),
keysort(KVs, KVsS),
maplist(el_keyed, ElsS, KVsS).
如果您的Prolog系统未提供maplist/3
,请参阅this answer。
最后一步可能是"加速"由:
keyvalue_value(_-V, V).
..., maplist(keyvalue_value, KVsS, ElsS), ...
或者,使用library(lambda)
不需要辅助定义:
list_lulasorted(Els, ElsS) :-
maplist(\El^(N-El)^( El=(_,_,L), length(L, N) ), Els, KVs),
keysort(KVs, KVsS),
maplist(\(_-V)^V^true, KVsS, ElsS).
一些注意事项:(A, B, L)
不像Haskell或ML那样频繁。相反,请使用.(A, B, L)
或(A*B)-L
之类的结构,具体取决于A
和B
的实际含义。