列表的顺序子集

Pra*_*ate 11 wolfram-mathematica

给出一个列表说

{"a", "b", "c", "d"}
Run Code Online (Sandbox Code Playgroud)

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

{
 {"a"},
 {"a b"},
 {"a b c"},
 {"a b c d"},
 {"b"},
 {"b c"},
 {"b c d"},
 {"c"},
 {"c d"},
 {"d"}
}
Run Code Online (Sandbox Code Playgroud)

Mr.*_*ard 19

我想我最喜欢这个:

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

ReplaceList[set, {___, x__, ___} :> {x}]
Run Code Online (Sandbox Code Playgroud)

使用字符串连接:

ReplaceList[set, {___, x__, ___} :> "" <> Riffle[{x}, " "]]
Run Code Online (Sandbox Code Playgroud)

类似地,特定于字符串:

StringCases["abcd", __, Overlaps -> All]
Run Code Online (Sandbox Code Playgroud)

由于纳赛尔说我在作弊,这里有一个更加手动的方法,在大型套装上也有更高的效率:

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"}]
Run Code Online (Sandbox Code Playgroud)

  • 这很棒!而且我认为这与Mathematica的核心概念完全一致,而不是作弊:) (3认同)

tom*_*omd 14

Flatten[Partition[{a, b, c, d}, #, 1] & /@ {1, 2, 3, 4}, 1]
Run Code Online (Sandbox Code Playgroud)

{{a},{b},{c},{d},{a,b},{b,c},{c,d},{a,b,c},{b,c,d} , {A B C D}}


Sil*_*via 7

这个怎么样:

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

bdidxset = Subsets[Range[4], {1, 2}]

origset[[#[[1]] ;; #[[-1]]]] & /@ bdidxset
Run Code Online (Sandbox Code Playgroud)

这使

{{"a"}, {"b"}, {"c"}, {"d"}, {"a", "b"}, {"a", "b", "c"}, {"a", "b", 
  "c", "d"}, {"b", "c"}, {"b", "c", "d"}, {"c", "d"}}
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ard 5

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

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

n = Length@set;

Join @@ Table[set~Take~{s, f}, {s, n}, {f, s, n}] // Column
Run Code Online (Sandbox Code Playgroud)

Mathematica图形

  • @yoda我认为答案的性质差异很大.我看到了综合答案的一个问题:目前尚不清楚*人们投票的方法,贬低选票的目的,选民可能觉得他们必须投票选出他们不喜欢的方法(或彻底失败),如果他们想要投票支持他们.与彼得的断言相反,我不是游戏投票. (3认同)