【发布时间】: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"}
}
【问题讨论】:
给定一个列表说
{"a", "b", "c", "d"}
有没有更简单的方法来生成这样的顺序子集列表(结果的顺序并不重要)
{
{"a"},
{"a b"},
{"a b c"},
{"a b c d"},
{"b"},
{"b c"},
{"b c d"},
{"c"},
{"c d"},
{"d"}
}
【问题讨论】:
我认为我最喜欢这个:
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"}]
【讨论】:
StringJoin @@@ (f[Most]/@f[Rest]@set // Flatten[#, 1] &) // Partition[#, 1] & // InputForm 中使用两个 NestList 函数,您将获得所需的输出
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}}
【讨论】:
这个怎么样:
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"}}
【讨论】:
我更喜欢 TomD 的方法,但这是我想到的,没有字符串处理:
set = {"a", "b", "c", "d"};
n = Length@set;
Join @@ Table[set~Take~{s, f}, {s, n}, {f, s, n}] // Column
【讨论】:
这是一种可能的解决方案
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
【讨论】:
一种方式:
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"}}
【讨论】:
你可以这样做:
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"}}
【讨论】: