15

人をキーとして、人とアイテムの評価のネストされた辞書があります。アイテムを共有する場合としない場合があります。例:

{
 'Bob' : {'item1':3, 'item2':8, 'item3':6},
 'Jim' : {'item1':6, 'item4':7},
 'Amy' : {'item1':6,'item2':5,'item3':9,'item4':2}
}

これらの関係を反転する最も簡単な方法を探しており、アイテムをキーとして新しいネストされた辞書を作成しています。例:

{'item1' : {'Bob':3, 'Jim':6, 'Amy':6},
 'item2' : {'Bob':8, 'Amy':5},
 'item3' : {'Bob':6, 'Amy':9},
 'item4' : {'Jim':7, 'Amy':2}
}

これを行う最善の方法は何ですか?了解の上で可能ですか?

4

5 に答える 5

4

Ryan Ginstromの答えがこれを行うための好ましい方法であることに完全に同意します(すべての実用的な目的のために)。

しかし、質問も明示的に尋ねているので:

了解の上で可能ですか?

リスト内包表記を使用してこれを行う方法について、簡単な例を挙げて説明したいと思います (これは、ネストされたリスト内包表記が読みやすさをどのように低下​​させるかを示す良い例になる可能性があります)。

import itertools

d = {
 'Bob' : {'item1':3, 'item2':8, 'item3':6},
 'Jim' : {'item1':6, 'item4':7},
 'Amy' : {'item1':6,'item2':5,'item3':9,'item4':2}
}

print dict([(x, dict([(k, d[k][x]) for k,v in d.items() if x in d[k]])) 
            for x in set(itertools.chain(*[z for z in d.values()]))])
于 2010-02-16T20:19:30.333 に答える
1

これは(他の人が示しているように)簡単に実行できますが、ニーズによっては、任意の基準で抽出したい複数の情報を含むデータの場合、データベースが最適なツールである可能性があることも考慮する必要があります。組み込みsqlite3モジュールは、オーバーヘッドの少ないデータベースを提供します。これは、実行している内容によっては、ネストされたdictよりも優れたサービスを提供する場合があります。

于 2010-02-16T17:52:25.063 に答える
0

パンダは別のオプションを提供できます。dataが入力辞書であると仮定します。

import pandas as pd
output = {i:s.dropna().to_dict() for i, s in pd.DataFrame(data).T.iteritems()}
于 2016-12-24T00:29:09.767 に答える