Wolfram mathematica 列表的连续子集

Wolfram mathematica 列表的连续子集,wolfram-mathematica,Wolfram Mathematica,给一张单子说 {"a", "b", "c", "d"} 有没有更简单的方法来生成这样的顺序子集列表(结果的顺序并不重要) 您可以这样做: 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", "c", "d"}
有没有更简单的方法来生成这样的顺序子集列表(结果的顺序并不重要)


您可以这样做:

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"}}
输出如下所示:

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"}}

这里有一个可能的解决方案

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
这个怎么样:

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"}}
单向:

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

给予

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


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

set = {"a", "b", "c", "d"};

n = Length@set;

Join @@ Table[set~Take~{s, f}, {s, n}, {f, s, n}] // Column

我想我最喜欢这个:

set = {"a", "b", "c", "d"};

ReplaceList[set, {___, x__, ___} :> {x}]
字符串连接时:

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

由于纳赛尔说我在作弊,这里有一种更为手动的方法,在大型场景中也有更高的效率:

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的核心概念非常一致,而不是作弊:)整洁!!!如果在以下表单中使用两个
NestList
函数
StringJoin@@(f[Most]/@f[Rest]@set//Flatten[#,1]&)//Partition[#,1]&//InputForm
,则可以获得所需的output@rcollyer我很高兴我的答案获得了很多选票;这一点对我来说似乎相当明显,而一些我认为非常聪明的人很难获得两到三张选票。我认为那些明显但聪明的人获得了最多的选票。那些聪明但不那么明显的人往往会获得更少的选票,因为理解的门槛更高。我很难理解莱昂尼德的一些观点,我很犹豫是否要给出一个我不理解的答案。@yoda我认为这些答案的性质完全不同。我认为综合答案存在一个问题:人们投票支持哪种方法并不清楚,这降低了投票的目的,选民可能会觉得,如果他们想投票给他们喜欢的方法,他们就必须投票给他们不喜欢的方法(或彻底失败)。与彼得的断言相反,我不是在玩投票。@Mr.Wizard我知道,我也没有注意彼得的评论。我知道你这样做是为了得到完全不同的答案,但我很好奇为什么在这里,当你似乎在另一个答案中加入了两种不同的风格。后来我意识到这是第一个答案,你可能在其中添加了编辑,以接近纳赛尔的评论。“无论如何,我并不在乎——只是好奇。”尤达我在休息室里贴了一个问题;我想知道社区对此有何看法。
StringCases["abcd", __, Overlaps -> All]
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"}]