如何展平嵌套列表?

问题描述 投票:0回答:3

我使用maplist(getEdgeInfo(Q_From_To),Edges,Edge_Info0)来收集图形中边缘的所有信息。 getEdgeInfo(Q_From_To)返回边的列表,每个列表的信息也作为列表返回,因此我得到以下Edge_Info0:

[ [[4,4,"n.v.t.",3,"n.v.t.",3,5,5,2]],
  [[5,5,"n.v.t.",3,"n.v.t.",3,12,12,2],[5,5,"n.v.t.",3,"n.v.t.",3,12,12,1]],
  [[5,5,"n.v.t.",3,"1.0",3,56,56,2]],
  ---
]

我需要的是以下格式的相同数据:

[ [4,4,"n.v.t.",3,"n.v.t.",3,5,5,2],
  [5,5,"n.v.t.",3,"n.v.t.",3,12,12,2],
  [5,5,"n.v.t.",3,"n.v.t.",3,12,12,1],
  [5,5,"n.v.t.",3,"1.0",3,56,56,2],
  ---
]

最佳方法是什么?我应该使用DCG吗? (我对DCG没有任何经验)。

swi-prolog
3个回答
0
投票

我结束了。希望这将适用于“真实”数据。

clean([]) --> [].
clean([Q_Set|Tail]) --> q_set(Q_Set), clean(Tail), [].

q_set([]) --> [].
q_set([Rec_Set|Tail]) --> rec_set(Rec_Set), q_set(Tail).

rec_set([]) --> [].
rec_set([Record|Tail]) --> [Record], rec_set(Tail). 

?- X = [[[a]], [[b],[c]], [[d]]], phrase(clean(X), List).
List = [a, b, c, d],
X = [[[a]], [[b], [c]], [[d]]]

* /


0
投票

第一次尝试将步骤扁平化得太深。以下代码给出了预期的转换:

clean([]) --> [].
clean([Rec_Set|Tail]) --> rec_set(Rec_Set), clean(Tail), [].

rec_set([]) --> [].
rec_set([Record|Tail]) --> [Record], rec_set(Tail).

0
投票
flatten([], []).
flatten([[X|R]|T], FL) :-
    flatten([X|R], Find), !,
    append(Find, NewFL, FL),
    flatten(T, NewFL).
flatten([X|T], [X|FL]):-
    flatten(T, FL).
© www.soinside.com 2019 - 2024. All rights reserved.