【问题标题】:Sequential Subsets of a list列表的顺序子集
【发布时间】:2012-01-14 10:07:22
【问题描述】:

给定一个列表说

{"a", "b", "c", "d"}

有没有更简单的方法来生成这样的顺序子集列表(结果的顺序并不重要)

{
 {"a"},
 {"a b"},
 {"a b c"},
 {"a b c d"},
 {"b"},
 {"b c"},
 {"b c d"},
 {"c"},
 {"c d"},
 {"d"}
}

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    我认为我最喜欢这个:

    set = {"a", "b", "c", "d"};
    
    ReplaceList[set, {___, x__, ___} :> {x}]
    

    用字符串连接:

    ReplaceList[set, {___, x__, ___} :> "" <> Riffle[{x}, " "]]
    

    类似的,特定于字符串:

    StringCases["abcd", __, Overlaps -> All]
    

    既然 Nasser 说我在作弊,这里有一个更手动的方法,在大型集合上也有更高的效率:

    ClearAll[f, f2]
    f[i_][x_] := NestList[i, x, Length@x - 1]
    f2[set_]  := Join @@ ( f[Most] /@ f[Rest][set] )
    
    f2[{"a", "b", "c", "d"}]
    

    【讨论】:

    • +1,这不公平,Wizard 先生,您让 Mathematica 使用这种方法完成所有艰苦的工作。你应该做点什么!
    • 这太棒了!而且我认为这非常符合 Mathematica 的核心概念,而不是作弊:)
    • 整洁!!!如果您在以下表单 StringJoin @@@ (f[Most]/@f[Rest]@set // Flatten[#, 1] &amp;) // Partition[#, 1] &amp; // InputForm 中使用两个 NestList 函数,您将获得所需的输出
    • @rcollyer 我很高兴我的哪个答案获得了很多选票;这个对我来说似乎相当明显,而我认为非常聪明的一些则很难获得两个或三个。
    • 我认为显而易见但聪明的人获得了最多的选票。那些聪明但不太明显的人往往会产生更少的选票,因为理解的门槛更高一些。我无法理解 Leonid 的某些内容,因此我不愿为我不理解的答案投票。
    【解决方案2】:
    Flatten[Partition[{a, b, c, d}, #, 1] & /@ {1, 2, 3, 4}, 1]
    

    给予

    {{a}, {b}, {c}, {d}, {a, b}, {b, c}, {c, d}, {a, b, c}, {b, c , d}, {a, b, c, d}}

    【讨论】:

      【解决方案3】:

      这个怎么样:

      origset = {"a", "b", "c", "d"};
      
      bdidxset = Subsets[Range[4], {1, 2}]
      
      origset[[#[[1]] ;; #[[-1]]]] & /@ bdidxset
      

      给了

      {{"a"}, {"b"}, {"c"}, {"d"}, {"a", "b"}, {"a", "b", "c"}, {"a", "b", 
        "c", "d"}, {"b", "c"}, {"b", "c", "d"}, {"c", "d"}}
      

      【讨论】:

        【解决方案4】:

        我更喜欢 TomD 的方法,但这是我想到的,没有字符串处理:

        set = {"a", "b", "c", "d"};
        
        n = Length@set;
        
        Join @@ Table[set~Take~{s, f}, {s, n}, {f, s, n}] // Column
        

        【讨论】:

        • @yoda 我认为答案具有足够不同的特征。我看到了综合答案的一个问题:不清楚人们投票的哪种方法,贬低了投票的目的,选民可能觉得他们必须为他们不喜欢的方法投票(或彻底失败) 如果他们想投票给他们愿意的人。与彼得的说法相反,我不是在玩选票。
        • @Mr.Wizard 我知道,我没有注意彼得的评论。我知道你这样做是为了得到足够不同的答案,但我很好奇为什么在这里,当你似乎在另一个答案中混合了两种不同的风格时。后来我意识到这是第一个答案,您可能会将编辑添加到该答案以保持接近 Nasser 的评论。无论如何,我并不在乎——只是好奇。
        • @yoda 我在休息室发了一个问题;我想知道社区对此有何看法。
        【解决方案5】:

        这是一种可能的解决方案

        a={"a","b","c","d"};
        StringJoin@Riffle[#, " "] & /@ 
          DeleteDuplicates[
           LongestCommonSubsequence[a, #] & /@ 
            DeleteCases[Subsets@a, {}]] // Column
        

        结果

        a
        b
        c
        d
        a b
        b c
        c d
        a b c
        b c d
        a b c d
        

        【讨论】:

          【解决方案6】:

          一种方式:

          makeList[lst_] := Map[ Union[lst[[1 ;; #]]] &, Range@Length[lst]]
          r = Map[makeList[lst[[# ;; -1]]] &, Range@Length[lst]];
          Flatten[r, 1]
          

          给予

          {{"a"}, 
           {"a", "b"}, 
           {"a", "b", "c"}, 
           {"a", "b", "c", "d"}, 
           {"b"},
           {"b", "c"},
           {"b", "c", "d"},
           {"c"}, 
           {"c", "d"}, 
           {"d"}}
          

          【讨论】:

            【解决方案7】:

            你可以这样做:

            a = {"a", "b", "c", "d"};
            b = List[StringJoin[Riffle[#, " "]]] & /@
              Flatten[Table[c = Drop[a, n];
                Table[Take[c, i], {i, Length[c]}],
                {n, 0, Length[a]}], 1]
            

            输出将如下所示:

            {{"a"}, {"a b"}, {"a b c"}, {"a b c d"}, {"b"}, {"b c"}, {"b c d"}, {"c"}, {"c d"}, {"d"}}
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-01-22
              • 1970-01-01
              • 2016-01-24
              • 2023-03-24
              • 2015-06-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多