배열을 양 끝에 대해 자르는 관용적인 방법은 무엇입니까?
파워셸의 배열 표기법은 기록되어 있기는 하지만 배열의 끝을 자를 때는 다소 기괴한 동작을 합니다.공식 문서의 이 섹션은 희귀성을 상당히 잘 요약하고 있습니다.
음수는 배열의 끝에서 계산됩니다.예를 들어, "-1"은 배열의 마지막 요소를 나타냅니다.배열의 마지막 세 요소를 표시하려면 다음을 입력합니다.
$a[-3..-1]
그러나 이 표기법을 사용할 때는 주의해야 합니다.
$a[0..-2]
이 명령은 마지막 명령을 제외하고 배열의 모든 요소를 참조하지는 않습니다.배열의 첫 번째 요소, 마지막 요소 및 두 번째부터 마지막 요소를 나타냅니다.
다음 코드는 이상함을 확인합니다.
$a = 0,1,2,3
$a[1..-1]
이는 실제로 다음과 같은 기이한 결과를 낳습니다.
1
0
3
그러면 질문은 배열의 시작과 끝을 비교하는 하나의 인덱스로 자르는 관용적인 방법은 무엇인가 하는 것입니다.
이 추악한 엉망진창보다 더 좋은 일이라고 말해주세요.
$a[1..($a.Count-1)]
편집:
제가 찾고 있는 것을 설명하는 또 다른 방법은 다음과 같습니다.이 파이썬 표현에 해당하는 관용어 파워셸:
a=1,2,3,4
a[1:-1]
, 로 할 수 있습니다.(2,3)
배열 끝에서 n개의 요소를 가져오려면 -n에서 -1로 요소를 가져오면 됩니다.
PSC:\> $a = 0,1,2,3PSC:\> $n = 2PSC:\> $a[-n...-1]23
편집: PowerShell은 어레이의 시작과 끝 모두에 대한 인덱싱을 지원하지 않습니다.$a[$i..$j]
입니다에서 a[i:j]
합니다.i
그리고.j
각각 첫 번째와 마지막 지수로서.나 ..
는 일련의 숫자를 생성하는 범위 연산자입니다.표정으로$a[$i..$j]
합니다를 합니다.$i..$j
정수 목록으로 이동한 다음 목록을 사용하여 다음 인덱스에서 배열 요소를 검색합니다.
PSC:\> $a = 0,1,2,3PSC:\> $i = 1; $j = -1PSC:\> $index = $i..$jPSC:\> $index10-1PSC:\> $a[$index]103
Python의 동작을 에뮬레이션해야 하는 경우 하위 표현식을 사용해야 합니다.
PSC:\> $a = 0,1,2,3PSC:\> $i = 1; $j = -1PSC:\> $a[$i..($a.길이+$j-1)12
원하는 만큼 깔끔하지는 않지만 PowerShell의 작동 방식은 더욱 깔끔합니다.
(@(1,2,3,4)) | Select-Object -Skip 1
반품...
2
3
4
Select-Object -Skip
그리고.Select-Object -SkipLast
예:
$a = 0,1,2,3
$a | Select-Object -Skip 1 | Select-Object -SkipLast 1
반환:
1
2
는 됩니다.Count
아니면Length
, 합니다 합니다.
이것은 배열의 양 끝을 잘라내는 가장 관용적인 방법이 될 수 있습니다.
$array[시작]..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로 돌아올 것입니다.
시작 값이 0으로 카운트를 시작하므로 시작 값 '2'는 배열의 세 번째 요소를 제공합니다.정지값은 ($a)로 계산됩니다.길이-3), 이 값은 $a이므로 마지막 두 값을 떨어집니다.길이-3 자체가 슬라이스에 포함됩니다.
명확성을 위해 $start와 $stop을 정의했습니다. 분명히 다음과 같이 쓸 수 있습니다.
$a = 1,2,3,4,5,6,7,8,9
$a[2..($a.Length-3)]
이것 또한 3 4 5 6 7을 반환합니다.
$arr = @(10, 1, 2, 3, 4, 5, 6, 7, 8, 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)
사실 코드가 그 자체를 말해줍니다.설명할 필요 없어요
하지만,
- 처음 5개의 요소를 제공하되, 그 5개의 요소 중 각각의 1초를 제공합니다.Python의 arr[:5:2]와 같음
- 마지막 5가지 요소를 가져옵니다.
- 고유한 요소를 제공
- 먼저 정렬한 다음 고유 정보를 제공합니다.
- 모듈로를 5, 정렬, 고유하게 적용하여 0과 같은 요소만 제공합니다.
- 해당 배열에서 세 개의 요소를 뺀 첫 번째 요소 개수만 제공합니다.
어레이에서 처음 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
을 했습니다.Select-Object -Skip $skipStart | Select-Object -SkipLast $skipEnd
정확한 항목을 꺼낼 수 있는 유일한 완벽한 관용적 방법입니다.
(@wensveven은 이 전략으로 먼저 도착했지만, SO는 아직 제가 코멘트를 하지 못하게 할 것이고, 저는 설명을 하는 것이 상세한 답변을 요구한다고 생각합니다.)
범위 계산이 작동하지 않습니다.
한 범위에서$a[3..$a.count-3]
즉다를 가정하면 .$a
네 개의 아이템을 가지고 있고, 당신이 생각할 수 있는 범위는3..1
.@(3, 2, 1)
에서 Python 에서는 3 은 a[3:-3]
부터 세 부터 세 개로 있기 0 (는 추가 명시적 부터 3에 3합니다 0에서입니다. (Python에서 범위 순서이며,a[-1:1:-1]
역순으로 결과를 허용합니다.)
출력형식
평소와 같이 출력을 배열로 강제해야 하는 경우 파이프라인을 다음과 같이 래핑할 수 있습니다.@(...)
집단적 강제@RiverHeart는 입력 배열 유형을 유지하고 싶다고 언급했습니다.Int32[]
, 하지만 일반적인 색인으로도 작동하지 않는다는 것을 알 수 있는 한, 제가 뭔가를 놓치고 있는 것 같습니다.
올바른 항목 가져오기
또 다른 간단한 언급: 사용하는 숫자가 범위 표기와는 약간 다릅니다.인덱스 1에서 시작하는 경우 제로 인덱스 배열에서 처음부터 하나의 항목도 건너뛸 수 있으므로 하나는 동일하지만 마지막에 하나를 건너뛸 경우 인덱스와 동일합니다.-2
, 또는 대등하게$a.count-2
, 두번째 원소에 대해서요
배열 인덱스 추가
마지막으로 범위 리터럴을 함께 추가하는 것은 좋은 기능입니다.위와 같은 이유로 일반화되지는 않지만, 범위가 겹친다면 실수로 동일한 아이템을 두 번 얻는 것을 막을 수는 없지만, 갈 수 있어서 좋습니다.$a[0..2+-3..-1]
처음 2개와 마지막 3개를 얻을 수 있는 대화형 프롬프트에서 별도의 어레이를 만들고 결합하는 것보다 더 간단하면서도 여전히 꽤 명확합니다.파이썬에 코를 대고 싶다면, 그것이 그렇게 간단히 할 수 없는 것 중 하나라고 생각합니다.
이것이 올바른 방법이라고 생각합니다. 다른 방법들은 모두 코드가 더 필요합니다.
$a[1..($a.Count-1)]
또한 배열을 문자열로 변환하면 다음과 같이 데이터를 쉽게 얻을 수 있습니다.
$a = 0,1,2,3
[string]::Concat($a).Substring(1)
언급URL : https://stackoverflow.com/questions/28460208/what-is-the-idiomatic-way-to-slice-an-array-relative-to-both-of-its-ends
'programing' 카테고리의 다른 글
Oracle plsql 블록에 삽입된 총 행 수를 세는 방법 (0) | 2023.10.05 |
---|---|
woo commerce 신규 사용자 이메일 (0) | 2023.10.05 |
cygwin - UNC 공유에 파일 복사 (0) | 2023.10.05 |
여러 열을 요인에 한 번에 강제 적용 (0) | 2023.10.05 |
포인터 표현: **ptr++*++*ptr 및 ++**ptruse (0) | 2023.10.05 |