例如我有A = [a,b,c,d]
和B = [[q,w,e],[r,t],[y,u],[i,o]]
,我想创建像C = [[a,[q,w,e]],[b,[r,t]],[c,[y,u]],[d,[i,o]]].
这样的对
我可以创建对列表,但我不想将每个人彼此组合在一起。有一个简单的方法吗?我无法正确地向Google定义问题。
答案 0 :(得分:5)
这个问题对我来说似乎没有多大意义,但让我们试一试:
我的第一个观察是所有三个列表的长度相同。有效地,你在这里有一个像元素一样的映射:
a_b_c(A,B,[A,B]).
现在使用maplist / 4:
?- As = [a,b,c,d], Bs = [[q,w,e],[r,t],[y,u],[i,o]], maplist(a_b_c, As, Bs, Cs).
As = [a,b,c,d],
Bs = [[q,w,e],[r,t],[y,u],[i,o]],
Cs = [[a,[q,w,e]],[b,[r,t]],[c,[y,u]],[d,[i,o]]].
但是,我敢说,我真的会考虑配对!我无法在上述任何表示中看到任何优点。
key_value_pair(K,V,K-V).
?- As = [a,b,c,d], Bs = [[q,w,e],[r,t],[y,u],[i,o]], maplist(a_b_c, As, Bs, Cs).
As = [a,b,c,d],
Bs = [[q,w,e],[r,t],[y,u],[i,o]],
Cs = [a-[q,w,e],b-[r,t],c-[y,u],d-[i,o]].
maplist/4
是常见的预定义或库谓词。 See also this post。如果你没有它:
maplist(_C_3, [], [], []).
maplist(Cont_3, [A|As], [B|Bs], [C|Cs]) :-
call(Cont_3, A, B, C),
maplist(Cont_3, As, Bs, Cs).
答案 1 :(得分:1)
我定义了以下谓词来解决该任务。
merge([X], [Y], [[X,Y]]).
merge([X|L1], [Y|L2], [[X,Y]|L3]):-merge(L1, L2, L3).
第一行是事实。将两个列表合并为一个元素的结果每个列表只有一个元素,该列表包含两个元素 X 和 Y 。
第二行指出:合并两个具有至少两个元素的列表的结果是一个列表,其中第一个元素等于两个元素的列表(每个列表的第一个元素),其余部分是合并的结果前两个列表的其余部分。
修改强>
如果你想处理空列表的情况,那么你可以使用这个定义:
merge([X], [Y], [[X,Y]]):-!.
merge([], [], []).
merge([X|L1], [Y|L2], [[X,Y]|L3]):-merge(L1, L2, L3).
它有点复杂,因为它使用 cut !
谓词来停止寻找解决方案。
答案 2 :(得分:0)
尝试这样的事情:
zip( [] , [Y|Ys , [ nil:Y | Zs ] ) :- % for lists of unequal length,
zip( [] , Ys , Zs ) . % create unmatched pairs and recurse down
zip( [X|Xs] , [] , [ X:nil | Zs ] ) :- % for lists of unqual lengths,
zip( Xs , [] , Zs ) . % create unmatched paris and recurs down
zip( [X|Xs] , [Y|Ys] , [ X:Y | Zs ] ) :- % otherwise
zip( Xs , Ys , Zs ) % - pair up and recurse down.
. %
处理不等长度源列表的其他策略: