收集由范围列表定义的列表的所有元素

我正在尝试执行以下操作:

我有一个清单,说:

a = {{1}, {2}, {3}, {4},{5},{6}}

以及指定范围的列表:

range = {{1, 3}, {4, 6}};

现在我想收到一个列表,该列表在“range”范围内收集list a 的所有列表元素。

结果应该是:

result = {{1,2,3},{4,5,6}}

我尝试了什么:

t = {};
result = AppendTo[t, a[[#[[1]], #[[2]] ]] ] & /@ a

但它不起作用。

5
虽然没有回答您的具体问题, TakeDrop 可能值得考虑? TakeDrop [Flatten @ a,3]TakeDrop [Flatten @ a,First @ range]
额外 作者 EndangeredMassa,

6 答案

我想这就是你想要的:

Flatten[Take[a, #]] & /@ range

{{1,2,3},{4,5,6}}

8
额外
result = Range @@@ range

{{1,2,3},{4,5,6}}

或者更像是你自己的代码:

a = {{1}, {2}, {3}, {4}, {5}, {6}};
range = {{1, 3}, {4, 6}};
t = {};
result = Last[AppendTo[t, a[[#[[1]] ;; #[[2]], 1]]] & /@ range]
6
额外
@totyped对于 a = {{1},{2},{3},{4},{5},{6}} ,您需要输出 {{1,2, 3},{4,5,6}}a = {1,2,3,4,5,6} 我不明白输出应该如何改变。输出应该是什么?
额外 作者 user3482383,
@totyped这就是为什么我不在第一个中使用 a 。我第二个你需要删除,1
额外 作者 user3482383,
非常感谢 !你为什么不在第一个解决方案中使用?
额外 作者 Alex Suaide,
如果a是:a = {1,2,3,4,5,6},你会怎么做?
额外 作者 Alex Suaide,
输出应该是相同的。
额外 作者 Alex Suaide,
a = {{1}, {2}, {3}, {4}, {5}, {6}}//Flatten;

range = {{1, 3}, {4, 6}};

Pick[a, #] & /@ Outer[IntervalMemberQ[Interval[#1], #2] &,
  range, a, 1]

(* {{1, 2, 3}, {4, 5, 6}} *)
5
额外

我可能在这里忽略了这一点,但在我看来,问题的概括构成了一些模糊性,所发布的答案似乎是以完全不同的方式推广和/或回答完全不同的问题。

这种歧义源于 arange 的良好顺序排序,但是对需求的一种解释(可能只是我的)

“我想收到一个列表,该列表在 range ”范围内收集列表a的所有列表元素

可以通过以下不太好的例子更好地说明:

SeedRandom[1]
a = [email protected][List /@ Range[20], 10]
range = {{1, #}, {# + 1, 20}} &@ RandomInteger[{Min[a] + 1, Max[a] - 2}]

(* {{1}, {2}, {6}, {8}, {9}, {11}, {13}, {16}, {17}, {19}} *)

(* {{1, 5}, {6, 20}} *)

“正确”输出(再次,根据我,可能不是OP)应该是

(* {{1, 2}, {6, 8, 9, 11, 13, 16, 17, 19}} *)

(据我所知)只有@ Nasser的 Map 和@BobHanlon的 Pick 提供。 (显然,这在某种程度上仍然“很好” - 我假设 a 是整数的有序列表, range 仅由两个间隔组成,等等。 。)

这里提供了“正确”答案的各种其他功能:

Pick[Flatten[a], UnitStep[Flatten[a] - range[[2, 1]]], #] & /@ {0, 1}

TakeDrop[#, [email protected][#, x_ /; x > range[[1, 2]]] - 1] &@ Flatten[a]

GatherBy[Flatten[a], # <= range[[1, 2]] &]

[email protected][Scan[Sow[#, # <= range[[1, 2]]] &, Flatten[a]]]

(他们还为问题中的示例提供了正确的输出。)

5
额外
事实上,我打开一个问题而不是vtc,因为不清楚,很多答案,但我对op的实际意图完全感到困惑。例如,为什么 a 必须是嵌套列表?
额外 作者 lee smite,

Using Intersection

a = [email protected]{{1}, {2}, {3}, {4}, {5}, {6}};
range = Range @@@ {{1, 3}, {4, 6}};

现在

Map[Intersection[a, #] &, range]

Mathematica graphics

让我们说你的数据现在变成了

a = [email protected]{{1}, {2}, {5}, {6}};

然后

Map[Intersection[a, #] &, range]

Mathematica graphics

4
额外
Flatten[a[[Span @@ #]]] & /@ range

{{1,2,3},{4,5,6}}

要么

Extract[a, List /@ (Range @@@ range), Flatten]

{{1,2,3},{4,5,6}}

更多例子:

Extract[Range[0, 100, 10], List /@ (Range @@@ range), Flatten]

{{0,10,20},{30,40,50}}

Extract[CharacterRange["A","Z"], List /@ (Range @@@ range), Flatten]

{{“A”,“B”,“C”},{“D”,“E”,“F”}}

4
额外