我正在尝试将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
}
}
我尝试了几种变体,但迷路了。
答案 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 = ...
才能分配两个一条语句中将值赋给两个变量。