如何整理哈希表中的值并将它们转换为百分比?
How can I collate values from a hashtable and turn them into percentages?
在 PowerShell 中,我正在生成哈希表,其中键的值为整数,但这需要转换为相对于其他键值对的百分比。考虑以下哈希表:
这里一共有4个键值对。但是,只有 QuestionSet1ARL
的值不是 0。因此我想报告 QuestionSet1ARL
的值为 100%。下面是一个略有不同的示例:
此处,QuestionSetTrust
和 QuestionSet4
的值为 5。因此它们占哈希表中值的 50%。如果 QuestionSetTrust
的值为 2,QuestionSet4
的值为 1,则百分比分别为 66% 和 33%。
我认为我需要创建一个辅助哈希表 (enabledSurveys)
来执行此操作(仅包含值大于 0 的键值对。为此,我编写了一个简单的循环:
foreach ($survey in $initialSurveys.Keys) {
# Set the ratio variable equal to the value from the hashtable. For ease of reading.
$surveyRatio = $initialSurveys.$survey
if ($surveyRatio -gt 0) {
$enabledSurveys.add($survey, $surveyRatio)
}
}
我想我需要对这些值求和以获得总数,然后从每个键中导出 contributedTotal。在我继续之前,有没有更直观的方法来推导出这些信息而不需要第二个哈希表?
最佳结果:
需要这些值的总和才能确定百分比。
$InitialSurveys = @{
'QuestionSetTrust' = 1
'QuestionSet4' = 5
}
$Total = 0
foreach ($Key in $InitialSurveys.Keys) {
$Total += $InitialSurveys[$Key]
}
$ResultHash = @{}
foreach ($Key in $InitialSurveys.Keys) {
$ResultHash[$Key] = "{0}%" -f "$([math]::Round(($InitialSurveys[$Key] / $Total * 100.0), 2))"
}
$ResultHash
补充 , this is a slightly different approach, using the Measure-Object
command to calculate the total sum and using hashtable's .GetEnumerator()
方法以迭代其 key/value 对。
$InitialSurveys = @{
QuestionSetTrust = 2
QuestionSet4 = 1
}
$Total = ($InitialSurveys.GetEnumerator() | Measure-Object Value -Sum).Sum
$Result = @{}
$InitialSurveys.GetEnumerator().ForEach{
$Result[ $_.Key ] = $_.Value * 100 / $Total
}
$Result | Format-Table Key, @{ n='Value'; e={ '{0}%' -f ([math]::Round($_.Value)) } }
为了计算百分比值,使用 intrinsic method .ForEach{}
而不是 ForEach-Object
或 foreach
。它应该比 ForEach-Object
更快并且比 foreach( $item in $collection )
.
更简洁
最后我们使用 Format-Table
's ability to provide a custom format by defining a calculated property 对 Value
列进行舍入并在输出中添加 %
符号。这样我们就可以在 $Result
哈希表中保留准确的数值,以便进一步计算并减少内存使用。
输出:
Name Value
---- -----
QuestionSet4 33%
QuestionSetTrust 67%
在 PowerShell 中,我正在生成哈希表,其中键的值为整数,但这需要转换为相对于其他键值对的百分比。考虑以下哈希表:
这里一共有4个键值对。但是,只有 QuestionSet1ARL
的值不是 0。因此我想报告 QuestionSet1ARL
的值为 100%。下面是一个略有不同的示例:
此处,QuestionSetTrust
和 QuestionSet4
的值为 5。因此它们占哈希表中值的 50%。如果 QuestionSetTrust
的值为 2,QuestionSet4
的值为 1,则百分比分别为 66% 和 33%。
我认为我需要创建一个辅助哈希表 (enabledSurveys)
来执行此操作(仅包含值大于 0 的键值对。为此,我编写了一个简单的循环:
foreach ($survey in $initialSurveys.Keys) {
# Set the ratio variable equal to the value from the hashtable. For ease of reading.
$surveyRatio = $initialSurveys.$survey
if ($surveyRatio -gt 0) {
$enabledSurveys.add($survey, $surveyRatio)
}
}
我想我需要对这些值求和以获得总数,然后从每个键中导出 contributedTotal。在我继续之前,有没有更直观的方法来推导出这些信息而不需要第二个哈希表?
最佳结果:
需要这些值的总和才能确定百分比。
$InitialSurveys = @{
'QuestionSetTrust' = 1
'QuestionSet4' = 5
}
$Total = 0
foreach ($Key in $InitialSurveys.Keys) {
$Total += $InitialSurveys[$Key]
}
$ResultHash = @{}
foreach ($Key in $InitialSurveys.Keys) {
$ResultHash[$Key] = "{0}%" -f "$([math]::Round(($InitialSurveys[$Key] / $Total * 100.0), 2))"
}
$ResultHash
补充 Measure-Object
command to calculate the total sum and using hashtable's .GetEnumerator()
方法以迭代其 key/value 对。
$InitialSurveys = @{
QuestionSetTrust = 2
QuestionSet4 = 1
}
$Total = ($InitialSurveys.GetEnumerator() | Measure-Object Value -Sum).Sum
$Result = @{}
$InitialSurveys.GetEnumerator().ForEach{
$Result[ $_.Key ] = $_.Value * 100 / $Total
}
$Result | Format-Table Key, @{ n='Value'; e={ '{0}%' -f ([math]::Round($_.Value)) } }
为了计算百分比值,使用 intrinsic method .ForEach{}
而不是 ForEach-Object
或 foreach
。它应该比 ForEach-Object
更快并且比 foreach( $item in $collection )
.
最后我们使用 Format-Table
's ability to provide a custom format by defining a calculated property 对 Value
列进行舍入并在输出中添加 %
符号。这样我们就可以在 $Result
哈希表中保留准确的数值,以便进一步计算并减少内存使用。
输出:
Name Value
---- -----
QuestionSet4 33%
QuestionSetTrust 67%