我想要反转字典的键和值。来自源词典Dictionary<int, string>
,我想得到Dictionary<string, List<int>>
。有List<int>
因为该值可以在不同的键下多次在源词典中。
示例:
{
1: "A"
2: "A"
3: "A"
4: "B"
5: "B"
6: "C"
7: "D"
}
将转换为:
{
"A": [1,2,3]
"B": [4,5]
"C": [6]
"D": [7]
}
感谢您的帮助。
修改
好的,在你们的帮助下,我能够理解这个算法。 现在我看到两种可能的解决方案(除其他外)并且不知道它们之间的真正区别是什么,因为结果似乎是相同的。
是否有任何性能问题?
var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key)
.ToDictionary(group => group.Key, group => group.AsEnumerable());
var byGroupBy = actions.GroupBy(pair => pair.Value, pair => pair.Key)
.ToDictionary(group => group.Key, group => group.AsEnumerable());
编辑2:
我最终只使用
var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key)
我没想到会这么简单。 谢谢大家。
答案 0 :(得分:26)
这是一个相当简单的LINQ表达式:
var res = dict
.GroupBy(p => p.Value)
.ToDictionary(g => g.Key, g => g.Select(pp => pp.Key).ToList());
首先,按值分组。这会创建以字符串作为键的组,并将KeyValuePair<int,string>
作为项目。
然后,您可以使用字典键的组键将组转换为字典,并将原始字典的键“展平”为ToList()
列表。
答案 1 :(得分:4)
您还可以按如下方式获得所需的结果:
var result = source
.GroupBy(x => x.Value, x => x.Key)
.ToDictionary(g => g.Key, g => g.ToList());
这给出与dasblinkenlight相同的结果,但将KeyValuePair的映射移动到group by子句
答案 2 :(得分:0)
dic = {1: "A", 2: "A", 3: "A", 4: "B", 5: "B", 6: "C", 7: "D"}
rev_dic = {}
for key in dic:
new_value = dic[key]
if not new_value in rev_dic:
rev_dic[new_value] = []
rev_dic[new_value].append(key)
for new_value in rev_dic:
rev_dic[new_value].sort()
print(rev_dic)
将打印:
{'A': [1, 2, 3], 'B': [4, 5], 'C': [6], 'D': [7]}