我有一个元素列表(元组):
tuples(
[
(a,b,[1,3,5,7]),
(a,b,[9,11,13,15]),
(a,b,[17,19,21,23]),
(c,d,[0,2,4,6]),
(c,d,[8,10,12,14]),
(c,d,[16,18,20,22]),
(e,f,[100,200,300,400]),
(e,f,[500,600,700,800]),
(e,f,[900,1000,1100,1200])
]
).
如何对它们进行分组,使其变为:
[
(a,b,[1,3,5,7,9,11,13,15,17,19,21,23]),
(c,d,[0,2,4,6,8,10,12,14,16,18,20,22]),
(e,f,[100,200,300,400,500,600,700,800,900,1000,1100,1200])
]
如我们所见,我们将 (a,b) (c,d) (e,f)
分组并连接它们各自的列表。
谢谢你的帮助。
最佳答案
这种有点像 SQL 的方式怎么样:
定义一个谓词来访问原始深层和讨厌的数据结构中的数据(它使用连词 (_,_)
来创建看起来像 n 元组但实际上“接近”列表的内容,除了在最终位置
的 Backbone )。在回溯时,它将拉出个人
一条一条记录,并在head变量中呈现其中的信息:
some_tuple(V,W,Values) :-
tuples(Tuples),
member((V,W,Values), Tuples).
然后使用 2 级收集 bagof/3打电话。
solution(Bag) :-
bagof((V,W,FlatBagForVW), % will backtrack over V,W
SubBag^(bagof(L,some_tuple(V,W,L),BagForVW), % collect lists for a given V,W
flatten(BagForVW,FlatBagForVW)), % flatten it
Bag). % what we want
完成!
如果你在 SWI-Prolog 中,首先告诉顶层打印机不要省略太多长列表:
?-
set_prolog_flag(answer_write_options,[max_depth(100)]).
然后:
?-
solution(Bag).
Bag = [(a,b,[1,3,5,7,9,11,13,15,17,19,21,23]),
(c,d,[0,2,4,6,8,10,12,14,16,18,20,22]),
(e,f,[100,200,300,400,500,600,700,800,900,1000,1100,1200])].
关于list - 根据列表中的值对列表元素进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65133897/