我有两个清单 b1 = {{1,2},{3,4},{4,5},{9,3},{15,2}}, b2 = {{1,7},{3,6},{8,5},{9,7}}
我的目标是,如果第一个元素相等,则在两个列表中添加第二个元素,并在两个列表中保留不同的元素。
{{1,9},{3,10},{4,5},{8,5},{9,10},{15,2}}
答案 0 :(得分:1)
b1 = {{1, 2}, {3, 4}, {4, 5}, {9, 3}, {15, 2}};
b2 = {{1, 7}, {3, 6}, {8, 5}, {9, 7}};
u = Union@Join[b1, b2][[All, 1]];
Map[{#, Total[Flatten[{
Cases[b1, {#, _}],
Cases[b2, {#, _}]}[[All, All, -1]]]]} &, u]
{{1,9},{3,10},{4,5},{8,5},{9,10},{15,2}}
或
g = GroupBy[Join[b1, b2], First -> Last];
Sort[{#1, Total[#2]} & @@@ Normal[g]]
{{1,9},{3,10},{4,5},{8,5},{9,10},{15,2}}
或者只是
Sort[Normal[GroupBy[Join[b1, b2], First -> Last, Total]] /. Rule -> List]
答案 1 :(得分:1)
这可能会吸引人
Sort[Join[b1, b2]] //. {a:___, {m_, n_}, {m_, p_}, z:___} :> {a, {m, n + p}, z}
未经严格测试。
答案 2 :(得分:0)
如果两个列表的长度相同,则可以使用Thread配对参数。然后,您可以编写一个函数来测试每一对,以决定如何处理它们。这样做会很好,除非您不希望两个参数不匹配时更改两个参数。要解决该问题,您可以使用“序列”技巧。
b1={{1,2},{3,4},{4,5},{9,3}}; b2={{1,7},{3,6},{8,5},{9,7}};
f[{a_,b_},{c_,d_}]:=If[a==c,{a,b+d},Sequence@@{{a,b},{c,d}}];
Thread[f[b1,b2]]
所有返回的结果
{{1,9},{3,10},{4,5},{8,5},{9,10}}
对于每对等长列表,这是否完全正确?
但是您已经编辑了问题,以允许长度不等的列表。线程将不起作用。但是也许您可以编写一个在此之上使用的函数。它将检查列表长度是否相等,如果是,则执行显示的内容,如果不相同,则修剪较长的列表,使用显示的内容,最后从较长的列表中追加多余的项目。
您能找出解决办法吗?