如果第一个元素相等,则从其他列表中添加列表的第二个元素(Mathematica)

时间:2020-08-04 14:53:30

标签: wolfram-mathematica

我有两个清单 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}}

3 个答案:

答案 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}}

对于每对等长列表,这是否完全正确?

但是您已经编辑了问题,以允许长度不等的列表。线程将不起作用。但是也许您可以编写一个在此之上使用的函数。它将检查列表长度是否相等,如果是,则执行显示的内容,如果不相同,则修剪较长的列表,使用显示的内容,最后从较长的列表中追加多余的项目。

您能找出解决办法吗?

相关问题