【问题标题】:Add the second element of list from other list if the first elements are equal (Mathematica)如果第一个元素相等,则从其他列表中添加列表的第二个元素(Mathematica)
【发布时间】:2020-08-04 14:53:30
【问题描述】:

我有两个列表 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}}

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我正在尝试添加在我的模拟循环中生成的列表。但是,我的问题是在所有情况下列表元素都不相同(在第一个坐标中)。最后,我需要一个列表中所有贡献的列表以进行绘图。

标签: wolfram-mathematica


【解决方案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]

【讨论】:

    【解决方案2】:

    如果您的两个列表长度相同,那么您可以使用 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}}
    

    这对于每对相等长度的列表是否完全正确?

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

    你能弄清楚怎么做吗?

    【讨论】:

    • 非常感谢您的帮助。
    【解决方案3】:

    这可能会上诉

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

    没有经过非常彻底的测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      相关资源
      最近更新 更多