【问题标题】:Mathematica Splitted List with Length values具有长度值的 Mathematica 拆分列表
【发布时间】:2012-01-27 18:14:05
【问题描述】:

在 Wolfram Mathematica 8.0 中,我有一个嵌套列表,例如:

             {{1,1,1},{0,0},{1,1,1,1,1},{0},{1,1},{0}}

并想用子字符串长度替换那些:

             {{3,3,3},{0,0},{5,5,5,5,5},{0},{2,2},{0}}

谁能告诉我解决这个问题的快速实用方法?

【问题讨论】:

  • 所以你不想数零?例如呢? {0,1,0}?

标签: wolfram-mathematica


【解决方案1】:
list = {{1, 1, 1}, {0, 0}, {1, 1, 1, 1, 1}, {0}, {1, 1}, {0}};
Map[Length[#]*# &, list]

Out[193]= {{3, 3, 3}, {0, 0}, {5, 5, 5, 5, 5}, {0}, {2, 2}, {0}}

【讨论】:

  • 那么,您认为您也会对新的Mathematica 网站感兴趣吗? :)
  • @rcollyer 我不确定(a)你为什么问(我已经在那里发了几次)和(b)你为什么在这里问这个(它与查询无关) . (另外我假设我可以通过其他方式到达;如果没有,那么我想这里和其他任何选择一样好。)也许我误解了这个问题。 (也许是 5 点钟的某个地方……)
  • 对不起。微笑是为了表明这是讽刺,尤其是当我问其他回答者同样的问题时。 (而且,是的,我知道你已经在那里发帖了。)
  • @rcollyer 我显然对表情符号的魅力无动于衷。
【解决方案2】:

如果

list = {{1, 1, 1}, {0, 0}, {1, 1, 1, 1, 1}, {0}, {1, 1}, {0}};

然后

list /. {items : 1 ..} :> ConstantArray[Length[{items}], Length[{items}]]

(将包含一个或多个 1 的所有列表替换为相应长度的列表,长度为值)给出:

{{3, 3, 3}, {0, 0}, {5, 5, 5, 5, 5}, {0}, {2, 2}, {0}}

【讨论】:

  • 我建议进行这些细微的更改:items:{1 ..} :> With[{l = Length@items}, ConstantArray[l, l]],因为它可以减少重复。此外,您可能对新的Mathematica 站点感兴趣。
【解决方案3】:

f := # /. (x_List /; Union@x=={1}) :> Table[Length@x, {Length@x}] &

用作

f/@list

更好(并窃取了 Jan 的部分答案):

f2 := # /. ConstantArray[1, Length@#] :> ConstantArray[Length@#, Length@#] &

【讨论】:

    【解决方案4】:

    尚不清楚您的数据可能包含哪些变体。如果您的子列表都是单调零或一,那么丹尼尔的方法有效。如果您需要更快的速度,您可以使用:

    f = Compile[{{s, _Integer, 1}}, If[s[[1]] == 1, s*Length@s, s]];
    
    f /@ list
    

    如果子列表可能包含其他元素和/或混合在一起,则需要进行更多测试。我会将最适合您数据的测试留给您:

    list /. x : {1 ..} :> (ConstantArray[#, #] &@Length@x)
    
    list /. {x : 1 ..} :> ConstantArray[+x, +x]
    
    list /. x : {1 ..} :> x * Tr@x
    

    最后,所有“代码高尔夫”爱好者:

    list /. {x:1..}:>+x{x}
    

    【讨论】:

    • 第二个代码块的第一行和第二行有错别字。 RHS 应该是 ConstantArray[Length@x, Length@x]ConstantArray[+x, +x]
    • @kguler 谢谢。我需要记住(1)阅读该死的问题(2)执行我该死的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2020-10-01
    • 2021-11-14
    • 2020-05-26
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多