【问题标题】:Get Index of an element/ element by index in List of Lists通过列表列表中的索引获取元素/元素的索引
【发布时间】:2013-12-03 16:46:01
【问题描述】:

如何在列表列表上实现类似于nth0/3 谓词的功能?

我希望能够知道列表列表中元素的索引是什么,但只对内部列表索引感兴趣。我的意思是说我有以下谓词indexOf([[a,b,c], [d,e,f], [g,h]], d, Index),它返回Index=0,因为d 是内部列表的第一个元素。 indexOf([[a,b,c], [d,e,f], [g,h]], c, Index) 应该返回 Index=2,因为它是内部列表的第三个元素。

到目前为止,我所做的如下:

iterateOuter([]).

iterateOuter([[H|T]|LIST], Elem,Idx):-indexOf([H|T],Elem, Idx2),(Idx is Idx2;iterateOuter(LIST, Elem,Idx)).

indexOf([_|Tail], Element, Index):-indexOf(Tail, Element, Index1), Index is Index1+1. 

indexOf([Element|_], Element, 0).

如果我调用iterateOuter([[a,b,c],[r,t,o]],c,Ind).

它会给我Ind = 2 这很好,但如果我说: iterateOuter([[a,b,c],[r,t,o]],r,Ind).

它只会给我错误,因为它只在第一个内部列表上给出结果。

【问题讨论】:

  • 如果元素在多个内部列表中怎么办?
  • 好点,对不起,我忘了添加在这种情况下,我想要 2 个与 nth0 相同的结果和一个简单的列表。
  • @user3009573 出于好奇,您想到的应用程序是什么,使得子列表中元素的索引很重要,但您不需要知道元素在哪个子列表中?

标签: list loops indexing prolog


【解决方案1】:

如果您已经拥有nth0/3,那么您拥有所需的一切:

| ?- Xss = [[a,b,c],[r,t,o]], nth0(I, Xss, Xs), nth0(J, Xs, c).
I = 0,
J = 2,
Xs = [a,b,c],
Xss = [[a,b,c],[r,t,o]] ? ;
no

| ?- Xss = [[a,b,c],[r,t,o]], nth0(I, Xss, Xs), nth0(J, Xs, r).
I = 1,
J = 0,
Xs = [r,t,o],
Xss = [[a,b,c],[r,t,o]] ? ;
no

【讨论】:

    【解决方案2】:

    由于您只对内部列表的索引感兴趣,因此您可以使用 member/2 而不是 nth0/3 来获取子列表,如 False 建议的那样。每个子列表都是列表 Ls 的成员,所以只需要查找 E 是否是成员的第 n 个元素:

    nth_of_a_sublist(N, Ls, E) :-
        member(L, Ls),
        nth0(N, L, E).
    

    要检查所有列表中的第 nth_of_a_sublist,您可以使用findall/3。

    但我认为 False 的解决方案更好,因为它为您提供了包含该元素的列表的索引,如果您不需要它可以忽略它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多