10

たとえば、リスト1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8と数値 4 を指定すると、長さ 4 のリストのリスト、つまり が返されます (1, 2, 3, 4), (5, 6, 7, 8), (1, 2, 3, 4), (5, 6, 7, 8)

基本的に、Powershell で次の Python コードを実装したいと考えています。

s = 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8
z = zip(*[iter(s)]*4)  # Here N is 4
# z is (1, 2, 3, 4), (5, 6, 7, 8), (1, 2, 3, 4), (5, 6, 7, 8)

次のスクリプトは、5 ではなく 17 を返します。

$a = 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,0
$b = 0..($a.Length / 4) | % {  @($a[($_*4)..($_*4 + 4 - 1)]) } 
$b.Length
4

7 に答える 7

46

これは少し古いですが、配列をチャンクに分割するために使用するメソッドを投入することにしました。構築されたプロパティで Group-Object を使用できます。

$bigList = 1..1000

$counter = [pscustomobject] @{ Value = 0 }
$groupSize = 100

$groups = $bigList | Group-Object -Property { [math]::Floor($counter.Value++ / $groupSize) }

$groupsGroupInfo オブジェクトのコレクションになります。この場合、各グループには正確に 100 個の要素 ( 、 などでアクセス可能$groups[0].Group)$groups[1].Groupがあります。カウンターにオブジェクト プロパティを使用して、-Property スクリプト ブロック内のスコープの問題を回避します$i++。元の変数。または、カスタム オブジェクトを使用せずに and を使用して同じ効果を得る$script:counter = 0ことができます。$script:counter++

于 2014-11-10T18:14:24.253 に答える
11

2009 年にこれを書いたPowerShell Split-Every 関数

おそらく改善できます。

Function Split-Every($list, $count=4) {
    $aggregateList = @()

    $blocks = [Math]::Floor($list.Count / $count)
    $leftOver = $list.Count % $count
    for($i=0; $i -lt $blocks; $i++) {
        $end = $count * ($i + 1) - 1

        $aggregateList += @(,$list[$start..$end])
        $start = $end + 1
    }    
    if($leftOver -gt 0) {
        $aggregateList += @(,$list[$start..($end+$leftOver)])
    }

    $aggregateList    
}

$s = 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8

$r = Split-Every $s 4

$r[0]
""
$r[1]
""
$r[2]
""
$r[3]
于 2012-12-15T01:20:41.887 に答える
6
PS> $a = 1..16
PS> $z=for($i=0; $i -lt $a.length; $i+=4){ ,($a[$i]..$a[$i+3])}
PS> $z.count
4    

PS> $z[0]
1
2
3
4

PS> $z[1]
5
6
7
8

PS> $z[2]
9
10
11
12

PS> $z[3]
13
14
15
16
于 2012-12-15T10:35:31.453 に答える
3

@Shay Levy Answer: a の値を 1..15 に変更すると、ソリューションが機能しなくなります (Peter Reavy コメント)

だからこれは私のために働いた:

$a = 1..15
$z=for($i=0; $i -lt $a.length; $i+=4){if ($a.length -gt ($i+3)) { ,($a[$i]..$a[$i+3])} else { ,($a[$i]..$a[-1])}}
$z.count
于 2016-07-18T12:56:03.310 に答える
1
Clear-Host

$s = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18

$count = $s.Length

$split = $count/2

$split --

$b = $s[0..$split]

$split ++

$a = $s[$split..$count]

write-host "first array"

$b

write-host "next array"

$a

#clean up
Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0
于 2014-07-15T07:45:47.320 に答える
1
$a = 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,0
$b = 0..([Math]::ceiling($a.Length / 4) - 1) | 
    % {  @(, $a[($_*4)..($_*4 + 4 - 1)]) } 

の後にコンマを入れなければならない理由がわかりません(

于 2012-12-15T03:15:46.403 に答える