web-dev-qa-db-ja.com

両端を基準にして配列をスライスする慣用的な方法は何ですか?

Powershellの配列表記は、文書化されていますが、配列の最後をスライスするという奇妙な動作をしています。 公式ドキュメント のこのセクションでは、奇妙さをかなりうまくまとめています。

負の数は、配列の最後から数えます。たとえば、「-1」は配列の最後の要素を指します。配列の最後の3つの要素を表示するには、次のように入力します。

$a[-3..-1]

ただし、この表記を使用する場合は注意が必要です。

$a[0..-2]

このコマンドは、最後の要素を除き、配列のすべての要素を参照しません。配列内の最初、最後、最後から2番目の要素を参照します。

次のコードは、奇妙さを確認します。

$a = 0,1,2,3
$a[1..-1]

実際にこの奇妙な結果を出力します:

1
0
3

質問は、配列の先頭と末尾に相対的な1つのインデックスでスライスする慣用的な方法は何ですかis

このい混乱よりも良いものだと教えてください:

$a[1..($a.Count-1)]

編集:

私が探しているものを説明する別の方法はこれです:このpython expression:

a=1,2,3,4
a[1:-1]

もちろん、これは(2,3)

35
alx9r

配列の最後から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 expression a[i:j]では、iおよびjをそれぞれ最初と最後のインデックスとして指定します。ただし、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の動作をエミュレートする必要がある場合は、mustでサブ式を使用する必要があります。

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

あなたが望むほどきちんとしたものではありませんが、PowerShellの動作方法はきれいです...

(@(1,2,3,4)) | Select-Object -Skip 1

戻ります...

2
3
4
8
John Warde

これは、配列の両端をスライスする最も慣用的な方法です。

$ array [start..stop]ここで、stopは、配列の長さから配列の最後からオフセットする値を引いて定義されます。

$a = 1,2,3,4,5,6,7,8,9
$start = 2
$stop = $a.Length-3
$a[$start..$stop]

これは3 4 5 6 7を返します

開始値はゼロからカウントを開始するため、開始値「2」は配列の3番目の要素を提供します。停止値は($ a.Length-3)で計算されます。これは、$ a.Length-3自体がスライスに含まれているため、最後の2つの値をドロップします。

明確にするために$ startと$ stopを定義しましたが、明らかに次のように書くこともできます。

$a = 1,2,3,4,5,6,7,8,9
$a[2..($a.Length-3)]

これも3 4 5 6 7を返します

3
Mathijs303

たとえば、配列の最初の3つの要素と最後の3つの要素を探し、その結果を配列にしたい場合は、少し配列を追加するだけで十分です。

[array]$A = (([int][char]'A')..([int][char]'Z')) | ForEach-Object {[char]$_}
$B = $A[0..2]+$A[-3..-1]
Clear-Host
Write-Host "Original List"
Write-Host $A -NoNewline -Separator ', '
Write-Host
Write-Host "First three and last three"
Write-Host $B -NoNewline -Separator ', '

利回り:

Original List
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
First three and last three
A, B, C, X, Y, Z
2
Dave Bradee

さて、それは地獄のようにいですが、[1..99]または[1..999]が動作することがわかりました。ただし、PowerShellが最初に値の配列を生成するため[1..999999]を使用しないでください。最初の5つの要素のみを決定し、最後の要素は100万個の要素配列を事前生成するのにかなり時間がかかります。

これは、特定のスクリプトシナリオに最適であり、運用コードにとっては恐ろしいものです。

1
Bill K

これが正しい方法だと思います。他のすべてのメソッドには、より多くのコードが必要です。

$a[1..($a.Count-1)]

また、配列を文字列に変換すると、次のようにデータを取得するのが簡単になります。

$a = 0,1,2,3
[string]::Concat($a).Substring(1)
0
mayursharma

$ arr = @(10、1、2、3、4、5、6、7、8、9、9、10)

$arr | Select-Object -First 5 | Select-Object -Index (@(0..4) | Where-Object { $_ % 2 -eq 0}) 
$arr | Select-Object -Last 5
$arr | Select-Object -Unique
$arr | Sort-Object | Select-Object -Unique
$arr | Where-Object {  $_ % 5 -eq 0 } | Sort-Object | Select-Object -Unique
$arr | Select-Object -First ($arr.Count - 3)

実際、コードはそれ自体を物語っています。イベントは説明する必要はありません。

ただし、1)最初の5つの要素を提供しますが、これら5つの要素の各秒は提供します。 Python 2)のarr [:5:2]と同じ最後の5つの要素を取得します。 3)一意の要素を指定します4)最初に並べ替えてから一意を指定します5)5のモジュロを適用して、0に等しい要素のみを指定します。 5)その配列内の要素の最初のカウントから3要素のみを引いたものを提供します。

0
Dani Konoplya