gpt4 book ai didi

c# - 我如何获取字典中的前 N ​​个(百分比)值?

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:14 24 4
gpt4 key购买 nike

我有一个包含字符串键和整数值的字典。该值表示键出现的次数。

如何使用代表前 25% 的值的键和值创建一个新字典?值的总和应等于或大于所有值的总和。例如,如果我的字典包含 5 个值为 (5, 3, 2, 1, 1) 的项目,而我想要前 50%,新字典将包含值 (5, 3),因为它们的总和为 8,即 > = 12 的 50%。这个字典需要按值降序排序,然后取前 N 个,使它们的总和满足指定的百分比。

这段代码给出了前 N 个,但基于已知计数。我如何考虑所需的百分比?

var topItemsCount = dictionary.OrderByDescending(entry => entry.Value)
.Take(topN)
.ToDictionary(pair => pair.Key, pair => pair.Value);

最佳答案

类似于:

var topItemsCount = dictionary.OrderByDescending(entry => entry.Value)
.Take(Math.Floor(dictionary.Count * 0.25))
.ToDictionary(pair => pair.Key, pair => pair.Value);

在字典上运行 .Count 会返回集合中键值对的数量。将 Math.Floor 向下舍入到最接近的整数。

编辑以反射(reflect)评论

我可能只使用一个简单的非 linq 解决方案来实现您想要的。可能更冗长,但任何人都清楚它的作用:

var total = dictionary.Sum(e => e.Value);
var cutoff = total * 0.5;
var sum = 0;

var pairs = new List<KeyValuePair<string, int>>();
foreach (var pair in dictionary.OrderByDescending(e => e.Value))
{
sum += pair.Value;
pairs.Add(pair);

if (sum > cutoff)
break;
}

dictionary = pairs.ToDictionary(pair => pair.Key, pair => pair.Value);

再编辑

如果你真的想要更多的 linq,你可以尝试持有一个累积的类级别变量。

private static int sum = 0;

static void Main(string[] args)
{
var dictionary = new Dictionary<string, int>()
{
{"1",5},
{"2",3},
{"3",2},
{"4",1},
{"5",1},
};

var total = dictionary.Sum(e => e.Value);
var cutoff = total * 0.5;

var filtered = dictionary.OrderByDescending(e => e.Value)
.TakeWhile(e => Add(e.Value).Item1 < cutoff)
.ToDictionary(pair => pair.Key, pair => pair.Value);
}

private static Tuple<int, int> Add(int x)
{
return Tuple.Create(sum, sum += x);
}

返回元组的 add 函数有点令人费解,因为您在结果中包括了第一个违反截止值的值(即,即使 5 + 3 = 8 大于截止值 6,您仍然包括 3 ).

关于c# - 我如何获取字典中的前 N ​​个(百分比)值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22138117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com