根据第三个元素对列表进行排序,并返回两个第一个元素

用户名

[[A,B,2000],[C,D,2008],[F,G,2004]]如上例所示,如何对基于每个列表中的最后一个元素组成的列表列表进行排序,并返回前两个元素。那是[[A,B],[F,G],[C,D]]

潜伏者

请注意,以大写字母开头的单词是变量,而不是原子。从问题陈述中尚不清楚,是否打算将列表元素用作变量。我假设它们是变量,因为它不会影响建议的解决方案。

可能有很多方法可以做到这一点,但是我不认为这是一种最佳方法:

1)用于setof以不同的顺序收集排序的值。也就是说,将您的列表收集为一个新列表,如下所示:[[2000,A,B],[2004,F,G],[2008,C,D]]假设每个列表项都是唯一的(没有所需的重复项)。

2)编写一个简单的谓词,遍历新列表并剥离每个子列表的第一个元素。

最终的解决方案如下所示:

process( L, Result ) :-
    setof([Z,X,Y], member([X,Y,Z], L), SortL),  % gives list like shown above
    stripyear(SortL, Result).

stripyear是将遍历每个列表项并去除年份(每个子列表的第一个元素)的谓词。它非常简单,并遵循基本的Prolog列表处理原则:

stripyear([[_,B,C]|T1], [[B,C]|T2]) :-...

这里main子句的开头说,如果我的输入是一个看起来像的列表[[_,B,C]|T1],那么输出就是一个看起来像的列表[[B,C]|T2]也就是说,第二个列表的头部是第一个列表的头部,其中第一个元素已删除。我们不在乎该元素的值是什么,因此我们_用来显示它。但是然后我们需要处理T1T2它们有什么关系?我已经照顾好了头。尾部以相同的方式递归相关:第二个列表的尾部是除去年份(第一个子列表元素)的第一个列表的尾部:stripyear(T1, T2)因此,完整的主要子句如下所示:

stripyear([[_,B,C]|T1], [[B,C]|T2]) :- stripyear(T1, T2).

很好,但是如何停止呢?如果我有一个空列表(striplist([], ?)),该怎么办?该列表[]不匹配,[[_,B,C]|T1]因为它没有头或尾。它是空的。而且如果没有条款来处理它,striplist([], Result)将会失败。因此,我需要一个子句单独处理它,这也得出了递归的结论:

stripyear([], []).

这表示,如果我从空列表中删除年份,则会得到一个空列表。很合逻辑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据Haskell中第三个列表的元素从两个列表中选择元素

来自分类Dev

从SQL查询中获取第一个/第二个/第三个元素

来自分类Dev

从SQL查询中获取第一个/第二个/第三个元素

来自分类Dev

将列表的第一个元素除以第二个元素,然后将第三个元素除以第四个元素,依此类推

来自分类Dev

根据第三个列表中的一个随机项,从两个列表之一中选择一个随机项

来自分类Dev

如何使用CSS类在第一个,第二个或第三个html元素中选择子元素?

来自分类Dev

使用 Excel 2016 按第三个类别列表对两个费用列表进行排序和排序

来自分类Dev

如何使用Flexbox将三个元素放在同一列中,第一个元素放在顶部,第二个和第三个元素位于剩余空间的中心?

来自分类Dev

如何从jQuery中的.each循环中获取第一个,第二个和第三个元素的值?

来自分类Dev

给定第三个列表,返回两个列表的索引列表

来自分类Dev

使用第三个列表对列表进行排序

来自分类Dev

显示每个数组的第一个和第三个值

来自分类Dev

显示每个数组的第一个和第三个值

来自分类Dev

从第一个表格中调用第三个表格

来自分类Dev

选择具有第一个条件的第三个表 [SQL]

来自分类Dev

我想减去 2 个数组并得到第三个数组,它由第一个数组的剩余元素组成

来自分类Dev

为两个阵列中的相似元素获取一个遮罩,并将其应用于第三个阵列

来自分类Dev

将两个不同数组的元素合并到第三个数组

来自分类Dev

根据数组的第一个元素对double [,]列表进行排序

来自分类Dev

创建新变量作为另一个变量的第一个值,按第三个变量排序

来自分类Dev

根据第三个参数对元组列表进行排序

来自分类Dev

使用IEnumerable方法,对列表的第一个和第二个元素执行操作,然后对第二个和第三个元素执行操作,依此类推,将结果作为新的IEnumerable返回

来自分类Dev

按 ArrayList<Integer> 中的第三个元素对 ArrayList<ArrayList<Integer>> 进行排序

来自分类Dev

Awk比较3个值,第一个文件值之间的第二个文件值,两个文件之间的多列打印输出到第三个文件

来自分类Dev

如何根据第一个选项选择更改第二个下拉列表和基于第二个选项选择的第三个下拉列表

来自分类Dev

如何对列表中的第三个元素进行变异?

来自分类Dev

如何乘名单在一起的每一个第三个要素,如果第一个元素是一样的吗?

来自分类Dev

我在第一个下拉列表中保留了选择选项值,但没有保留第二个或第三个

来自分类Dev

通过递归将两个链接列表排序到第三个链接列表中-C ++

Related 相关文章

  1. 1

    根据Haskell中第三个列表的元素从两个列表中选择元素

  2. 2

    从SQL查询中获取第一个/第二个/第三个元素

  3. 3

    从SQL查询中获取第一个/第二个/第三个元素

  4. 4

    将列表的第一个元素除以第二个元素,然后将第三个元素除以第四个元素,依此类推

  5. 5

    根据第三个列表中的一个随机项,从两个列表之一中选择一个随机项

  6. 6

    如何使用CSS类在第一个,第二个或第三个html元素中选择子元素?

  7. 7

    使用 Excel 2016 按第三个类别列表对两个费用列表进行排序和排序

  8. 8

    如何使用Flexbox将三个元素放在同一列中,第一个元素放在顶部,第二个和第三个元素位于剩余空间的中心?

  9. 9

    如何从jQuery中的.each循环中获取第一个,第二个和第三个元素的值?

  10. 10

    给定第三个列表,返回两个列表的索引列表

  11. 11

    使用第三个列表对列表进行排序

  12. 12

    显示每个数组的第一个和第三个值

  13. 13

    显示每个数组的第一个和第三个值

  14. 14

    从第一个表格中调用第三个表格

  15. 15

    选择具有第一个条件的第三个表 [SQL]

  16. 16

    我想减去 2 个数组并得到第三个数组,它由第一个数组的剩余元素组成

  17. 17

    为两个阵列中的相似元素获取一个遮罩,并将其应用于第三个阵列

  18. 18

    将两个不同数组的元素合并到第三个数组

  19. 19

    根据数组的第一个元素对double [,]列表进行排序

  20. 20

    创建新变量作为另一个变量的第一个值,按第三个变量排序

  21. 21

    根据第三个参数对元组列表进行排序

  22. 22

    使用IEnumerable方法,对列表的第一个和第二个元素执行操作,然后对第二个和第三个元素执行操作,依此类推,将结果作为新的IEnumerable返回

  23. 23

    按 ArrayList<Integer> 中的第三个元素对 ArrayList<ArrayList<Integer>> 进行排序

  24. 24

    Awk比较3个值,第一个文件值之间的第二个文件值,两个文件之间的多列打印输出到第三个文件

  25. 25

    如何根据第一个选项选择更改第二个下拉列表和基于第二个选项选择的第三个下拉列表

  26. 26

    如何对列表中的第三个元素进行变异?

  27. 27

    如何乘名单在一起的每一个第三个要素,如果第一个元素是一样的吗?

  28. 28

    我在第一个下拉列表中保留了选择选项值,但没有保留第二个或第三个

  29. 29

    通过递归将两个链接列表排序到第三个链接列表中-C ++

热门标签

归档