2016-11-08 8 views
3

私は2つの辞書を持っています。 1つはchapter_idとbook_id:{99: 7358, 852: 7358, 456: 7358}です。ここでは一例として単なる本ですが、たくさんあります。もう1つは同じchapter_idといくつかの情報:{99: [John Smith, 20, 5], 852: [Clair White, 15, 10], 456: [Daniel Dylan, 25, 10]}。章IDはすべての本を通してユニークです。そして、私はそれがすべての本がそれが含むすべての章から情報を得る方法でそれを組み合わせなければなりません。 {7358:[[99,852,456],[John Smith, Claire White, Daniel Dylan],[20,15,25],[5,10,10]]}のようなものです。私はまた、すでに各書籍が持っているすべての章のIDを持つ辞書を持ったファイルを持っています。私は両方の辞書(彼らはリストであった)をループすることによってそれを行う方法を知っています。しかし、それは年を取る。そのため、現在は辞書になっており、すべての章で1つのループで管理できると思います。しかし、私の頭の中では、私はいつも本や章のループに戻ります。どんなアイデアも非常に高く評価されています!最終的な結果はファイルに書きますので、それが入れ子になっている辞書なのかどうかはそれほど重要ではありません。または少なくとも私はそう考える。Pythonの1つのループで2つの辞書に反復する

+0

辞書を一緒に圧縮してから、結果をループしてみてください。おそらくまだ高価ですが、試してみる価値があります。実際には、ジェネレータを介して遅延して動作する可能性があるため、実際には非常に安くなる可能性があります。 – Carcigenicate

+1

あなたの最初のdictはdictsのリストです:それはタイプミスですか? – brianpck

+0

@brianpckはい、申し訳ありません – student

答えて

2

他のパッケージを使用している場合は、pandasをご覧になりたい場合は、多くのことを簡単かつ迅速に行うことができます。ここでは、提供したデータに基づく例を示します。

import pandas as pd 
d1 = {99: 7358, 852: 7358, 456: 7358} 
df1 = pd.DataFrame.from_dict(d1, "index") 
df1.reset_index(inplace=True) 

d2 = {99: ["John Smith", 20, 5], 852: ["Clair White", 15, 10], 456: ["Daniel Dylan", 25, 10]} 
df2 = pd.DataFrame.from_dict(d2, "index") 
df2.reset_index(inplace=True) 

df = df1.merge(df2, left_on="index", right_on="index") 
df.columns = ["a", "b", "c", "d", "e"] 

# all data for 7358 (ie subsetting) 
df[df.b == 7358] 
# all names as a list 
list(df[df.b == 7358].c) 
+0

それは大きな助けです! 20時間ではなく45秒。私はショックを受けました:)しかし、reset_indexのステップが必要な理由はわかりません – student

+0

うまくいって:) reset_indexを使って行のインデックスから列を作成し、後でマージできます。行名をマージすることは可能かもしれませんが、これを行う方法について私の記憶をリフレッシュするためにドキュメントに多くの時間を費やすことはありませんでした。 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.htmlおよびhttp://pandas.pydata.org/pandas-docs/stable/merging.htmlをさらに確認してください。 –

2

あなたはいつも同じキーが両方の辞書に表示されていることを考えると、辞書のキーを反復処理することができます:あなたが唯一の章を反復処理する必要が

for chapter_id in dict1: 
    book_id = dict1[chapter_id] 
    chapter_info = dict2[chapter_id] 
1
from collections import defaultdict 

def append_all(l, a): 
    if len(l) != len(a): 
     raise ValueError 
    for i in range(len(l)): 
     l[i].append(a[i]) 


final_dict = defaultdict(lambda: [[],[],[],[]]) 
for chapter, book in d1.items(): 
    final_dict[book][0].append(chapter) 
    append_all(final_dict[book][1:], d2[chapter]) 

append_all関数を明示的な追加で置き換えることはできますが、そうすることは醜いようです。私はこれには方法がないことに驚いていますが、ちょうど私がここでzipを使用する巧妙な方法を欠場しているかもしれません。

関連する問題