【问题标题】:Selecting item from list in mathematica从mathematica中的列表中选择项目
【发布时间】:2012-05-07 13:24:39
【问题描述】:

我在 Mathematica 中有一个很大的规则列表,但我想选择符合某些条件的项目。虽然我一直在尝试使用 Select 和 Take 命令,但我一直无法获得所需的输出..

示例:假设我想从 A->1.2 的列表中选择项目。

list={{A->1,B->2.1,C->5.2},{A->1.1,B->2.6,C->5.5},{A->1.2,B->2.7,C->5.7},{A->1.3,B->2.9,C->6.1}};

期望的输出是 {A->1.2,B->2.7,C->5.7}

我知道可以根据它们的价值从列表中选择项目。但是我如何从规则列表中做到这一点?

谢谢

编辑:显然,案例可以解决问题:

案例[列表,{A-> # | A-> 合理化[#], 规则[_, _] ..}] & /@ {1.2}

这也搜索有理和非有理形式的数字,这是我发现的另一个问题。

【问题讨论】:

  • 可能值得查看测试版网站:mathematica.stackexchange.com 以了解未来的 Mathematica 问题。
  • 嗨 Sosi,如果你喜欢 Perl 和数学,你会喜欢 PDL :-)
  • @G.Cito 哇,太好了!!!非常感谢!

标签: list select wolfram-mathematica rules


【解决方案1】:

一种可能性是使用Select

例如

Select[mylist, MemberQ[#, A -> 1] &]

给予

(* {{A -> 1, B -> 2.1, C -> 5.2}}*)

其他例子;

Select[mylist, MemberQ[#, A -> 1.1 |  1.2] &]

Select[mylist, 
 MemberQ[#, A -> 1.1 |  1.2 | 1.3] && FreeQ[#, C -> 6.1] &]

【讨论】:

    【解决方案2】:

    另一种选择:

    Select[list, A == 1.2 /. # &]
    

    此解决方案的优点是它使用Equal 而不是MatchQ(或等效项)。 1.2 == 6/5 给出True(数学意义上的比较),而MatchQ[1.2, 6/5] 给出False(结构比较)。当然,总是可以通过MatchQ[1.2, x_ /; x == 6/5] 来解决这个问题。

    此外,此解决方案忽略列表中规则的顺序。

    【讨论】:

    • 谢谢!事实上,使用您的建议可以避免包含Rationalize。然而,我仍然理解在Select 的条件下拥有Equal 如何允许查找规则。
    • @SosiKun 在文档中查找ReplaceAll。我使用/. 运算符将A 替换为规则中的任何内容。
    【解决方案3】:

    或者使用Cases:

    Cases[list, {A -> 1.2, ___}]

    【讨论】:

      【解决方案4】:

      另一个:

      Pick[#, A /. #, 1.2]& @ list
      

      【讨论】:

        【解决方案5】:

        "期望的输出是 {A->1.2,B->2.7,C->5.7}" 所以上面的答案应该是扁平的:)

        Cases[N@mylist, {___, A -> 1.2, ___}] // Flatten
        

        使用 N 将 6/5 等内容转换为 1.2。

        【讨论】:

          猜你喜欢
          • 2016-03-27
          • 1970-01-01
          • 1970-01-01
          • 2018-01-25
          • 1970-01-01
          • 2012-04-04
          • 2015-03-12
          • 1970-01-01
          • 2012-02-01
          相关资源
          最近更新 更多