将数组相对于两端切割的惯用方法是什么?

alx*_*x9r 38 arrays powershell idioms

Powershell的数组符号在切片数组末尾时有相当奇怪的行为,虽然有记录.官方文档中的这一部分总结了奇异性:

负数从数组末尾开始计算.例如," - 1"表示数组的最后一个元素.要显示数组的最后三个元素,请键入:

$a[-3..-1]
Run Code Online (Sandbox Code Playgroud)

但是,使用此表示法时要小心.

$a[0..-2]
Run Code Online (Sandbox Code Playgroud)

除最后一个命令外,此命令不引用数组的所有元素.它指的是数组中的第一个,最后一个和倒数第二个元素.

以下代码证实了这一奇异性:

$a = 0,1,2,3
$a[1..-1]
Run Code Online (Sandbox Code Playgroud)

这确实输出了这个奇怪的结果:

1
0
3
Run Code Online (Sandbox Code Playgroud)

所以,问题是,什么相对一个指数开始和阵列的另一个亲戚年底裁习惯的方法?

请告诉我这比这个丑陋的混乱更好:

$a[1..($a.Count-1)]
Run Code Online (Sandbox Code Playgroud)

编辑:

描述我正在寻找的东西的另一种方式是:与这个python表达式相当的惯用Powershell:

a=1,2,3,4
a[1:-1]
Run Code Online (Sandbox Code Playgroud)

当然,这是评估的 (2,3)

Ans*_*ers 38

如果要从数组末尾获取n个元素,只需将元素从-n提取到-1:

PS C:\> $a = 0,1,2,3
PS C:\> $n = 2
PS C:\> $a[-$n..-1]
2
3

编辑: PowerShell不支持相对于数组的开头结尾的索引,因为它的$a[$i..$j]工作方式.在Python表达式中,a[i:j]您分别指定ij作为第一个和最后一个索引.但是,在PowerShell中..范围运算符,它生成一系列数字.在表达式中$a[$i..$j],解释器首先求值为$i..$j整数列表,然后该列表用于检索这些索引上的数组元素:

PS C:\> $a = 0,1,2,3
PS C:\> $i = 1; $j = -1
PS C:\> $index = $i..$j
PS C:\> $index
1
0
-1
PS C:\> $a[$index]
1
0
3

如果需要模拟Python的行为,则必须使用子表达式:

PS C:\> $a = 0,1,2,3
PS C:\> $i = 1; $j = -1
PS C:\> $a[$i..($a.Length+$j-1)]
1
2


Joh*_*rde 11

尽管不像你想要的那样整洁,但PowerShell的工作方式更清晰......

(@(1,2,3,4)) | Select-Object -Skip 1
Run Code Online (Sandbox Code Playgroud)

回报......

2
3
4
Run Code Online (Sandbox Code Playgroud)


wen*_*een 6

结合Select-Object -SkipSelect-Object -SkipLast喜欢:

$a = 0,1,2,3
$a | Select-Object -Skip 1 | Select-Object -SkipLast 1
Run Code Online (Sandbox Code Playgroud)

返回:

1
2
Run Code Online (Sandbox Code Playgroud)

不像 Python 那样优雅,但至少您不必使用Countor Length,这意味着如果数组未存储在变量中,这也可以工作。