11

辞書のキーと値を逆にしたいと思います。つまり、ソース辞書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]
}

手伝ってくれてありがとう。

編集:

OK、皆さんの助けを借りて、このアルゴリズムについて少し理解することができました。今、私は(とりわけ)2つの可能な解決策を見て、結果が同じであるように見えるので、それらの間の本当の違いは何ですか。

パフォーマンスの問題はありますか?

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)

こんなに簡単だとは思いませんでした。皆さんありがとう。

4

3 に答える 3

27

これはかなり単純な LINQ 式です。

var res = dict
    .GroupBy(p => p.Value)
    .ToDictionary(g => g.Key, g => g.Select(pp => pp.Key).ToList());

まず、値でグループ化します。これにより、文字列をキーとして、およびKeyValuePair<int,string>その項目としてグループが作成されます。

次に、辞書キーにグループのキーを使用し、元の辞書のキーをToList().

于 2013-10-22T12:58:10.547 に答える
-3
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]}
于 2020-01-03T12:26:36.293 に答える