2012-01-14 73 views
11

的顺序亚群说给出一个列表的列表

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

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

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

回答

19

我想我喜欢这个最重要的是:

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

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

随着字符串加入:

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

与此类似,具体为字符串:

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

由于纳赛尔说我作弊,这里是一个更手动的办法,也有大型成套更高的效率:

ClearAll[f, f2] 
f[i_][x_] := NestList[i, x, [email protected] - 1] 
f2[set_] := Join @@ (f[Most] /@ f[Rest][set]) 

f2[{"a", "b", "c", "d"}] 
+0

+1,这是不公正的先生,你让Mathematica用这种方法做所有的辛苦工作。你应该做点什么! – Nasser 2012-01-14 13:31:13

+0

这是神奇的,不是编程! – acl 2012-01-14 13:36:54

+3

这太棒了!我认为这与Mathematica的核心概念非常吻合,而不是作弊:) – Silvia 2012-01-14 15:32:42

1

你可以像这样做:

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

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

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

结果

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

如何:

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

单程:

makeList[lst_] := Map[ Union[lst[[1 ;; #]]] &, [email protected][lst]] 
r = Map[makeList[lst[[# ;; -1]]] &, [email protected][lst]]; 
Flatten[r, 1] 

给出

{{"a"}, 
{"a", "b"}, 
{"a", "b", "c"}, 
{"a", "b", "c", "d"}, 
{"b"}, 
{"b", "c"}, 
{"b", "c", "d"}, 
{"c"}, 
{"c", "d"}, 
{"d"}} 
14
Flatten[Partition[{a, b, c, d}, #, 1] & /@ {1, 2, 3, 4}, 1] 

给出

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

+0

+1 ,比巫师先生复杂得多,但还是不错的。 – rcollyer 2012-01-16 02:50:13

5

我喜欢TomD的方法更好,但这是来到我的脑海里,SANS字符串处理:

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

n = [email protected]; 

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

Mathematica graphics

+1

为什么两个答案? – abcd 2012-01-14 15:36:49

+1

@yoda更多代表,当然 – 2012-01-14 17:45:27

+3

@yoda我认为答案是充分不同的性格。我看到一个综合性答案的问题:不清楚人们投票选择哪种方法,贬低投票的目的,选民可能会觉得如果他们想要投票,他们必须为不喜欢的方法投票(或彻底失败)为他们所做的一票投票。与彼得的断言相反,我不是在玩游戏票。 – 2012-01-15 00:02:30

相关问题