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

Wolfram mathematica 如果第一个元素相等,则从其他列表中添加列表的第二个元素(Mathematica),wolfram-mathematica,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}如果两个列表的长度相同,则可以使用线程将参数配对。然后您可以编写一个函数来测试每一对,以决定如何处理它们。这将很好,除非您不希望在前两项不匹配的情况下更改这两个参数。为了克服这个问题,你可以使用序

我有两张单子 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}如果两个列表的长度相同,则可以使用线程将参数配对。然后您可以编写一个函数来测试每一对,以决定如何处理它们。这将很好,除非您不希望在前两项不匹配的情况下更改这两个参数。为了克服这个问题,你可以使用序列技巧

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}}
对于每一对等长列表,这完全正确吗

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


你能想出怎么做吗?

如果你的两个列表长度相同,那么你可以使用线程来配对参数。然后您可以编写一个函数来测试每一对,以决定如何处理它们。这将很好,除非您不希望在前两项不匹配的情况下更改这两个参数。为了克服这个问题,你可以使用序列技巧

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]]
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}}
对于每一对等长列表,这完全正确吗

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

你能想出办法吗

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}

{1,9},{3,10},{4,5},{8,5},{9,10},{15,2}

或者只是

Sort[Normal[GroupBy[Join[b1, b2], First -> Last, Total]] /. Rule -> List]
{1,9},{3,10},{4,5},{8,5},{9,10},{15,2}

{1,9},{3,10},{4,5},{8,5},{9,10},{15,2}

或者只是

Sort[Normal[GroupBy[Join[b1, b2], First -> Last, Total]] /. Rule -> List]
这可能有吸引力

Sort[Join[b1, b2]] //. {a:___, {m_, n_}, {m_, p_}, z:___} :> {a, {m, n + p}, z}
没有经过彻底的测试。

这可能会吸引人

Sort[Join[b1, b2]] //. {a:___, {m_, n_}, {m_, p_}, z:___} :> {a, {m, n + p}, z}

测试不够彻底。

到目前为止您尝试了什么?我正在尝试添加在模拟周期中生成的列表。但是,我有一个问题,列表元素在所有情况下都不相同(在第一个坐标中)。最后,我需要一个列表中所有贡献的列表,用于绘图。到目前为止,您尝试了什么?我正在尝试添加在模拟循环中生成的列表。但是,我有一个问题,列表元素在所有情况下都不相同(在第一个坐标中)。最后,我需要一份所有贡献的列表,用于策划。非常感谢你的帮助。非常感谢你的帮助。