将Python脚本转换为PowerShell

时间:2018-12-30 22:14:37

标签: python powershell

我正在尝试将Python脚本转换为PowerShell,但我没有任何Python经验,并且花一点时间写一些代码。

def combinliste(seq, k):
    p = []
    i, imax = 0, 2**len(seq)-1
    while i<=imax:
        s = []
        j, jmax = 0, len(seq)-1
        while j<=jmax:
            if (i>>j)&1==1:
                s.append(seq[j])
            j += 1
        if len(s)==k:
            p.append(s)
        i += 1
    return p

我做了一些事情,但我真的不知道这是否正确。 PowerShell中的+=是什么,和Python一样?

function combinliste {
    Param($seq, $k)
    $p = @()
    $i; $imax = 0, [Math]::Pow(2, $seq.Count) - 1
    while ($i -le $jmax) {
        $s = @()
        $j, $jmax = 0, $seq.Count - 1
        while ($j -le $jmax) {
            if ($i -shr $j -band 1 -eq 1) {
                $s + ($seq ???? #I don't know how to do it here
            }
            $j #humm.. 1
        }
        if ($s.Count -eq $k) {
            $p + $s
        }
        $i #humm.. 1
        return $p
    }
}

我尝试了几种变体,但迷路了。

2 个答案:

答案 0 :(得分:1)

function combinliste { param($seq,$k) 

$p = New-Object System.Collections.ArrayList

$i, $imax = 0, ([math]::Pow(2, $seq.Length) - 1)

while ($i -le $imax) {

     $s = New-Object System.Collections.ArrayList
     $j, $jmax = 0, ($seq.Length - 1)
     while ($j -le $jmax) {
         if((($i -shr $j) -band 1) -eq 1) {$s.Add($seq[$j]) | Out-Null}
         $j+=1
         }
     if ($s.Count -eq $k) {$p.Add($s) | Out-Null }
     $i+=1
   }

  return $p
}

$p = combinliste @('green', 'red', 'blue', 'white', 'yellow') 3

$p | foreach {$_ -join " | "}

答案 1 :(得分:0)

append()方法就地更新数组。 PowerShell中的+运算符不会执行此操作。您需要+=赋值运算符。

$s += $seq[$j]

$p += $s

或者,您可以使用ArrayList集合而不是普通数组:

$s = New-Object 'Collections.ArrayList'

并使用其Add()方法:

$s.Add($seq[$j]) | Out-Null

结尾的Out-Null用于禁止默认Add()输出的附加项目的索引。


旁注:您可能需要将return $p 放在外部while之后,并且$i; $imax = ...必须为$i, $imax = ...才能分配两个一条语句中将值赋给两个变量。