2017-09-07 16 views
-2

私はたくさんのキーとそれらのキーの約100の値を持つ辞書を持っています。 しかし、すべての辞書には最後にIDがあり、すべての辞書の値をある参考文献と比較する必要があります。例えば、キー :同じ文字列が含まれている場合は同じ文字列のキーを比較するpython

{'mmc-1/bbc-1': { 
'inner_key1' : '1', 
'inner_key2' : '4', 
'inner_key3' : '3', 
'inner_key4' : '5', 
'inner_key5' : '4', 
'inner_key6' : '5', 
'inner_key7' : '2', 
'inner_key8' : '0', 
'inner_key9' : '10'}, 
'mmc-1/bbc-2': { 
'inner_key1' : '3', 
'inner_key2' : '4', 
'inner_key3' : '3', 
'inner_key4' : '5', 
'inner_key5' : '6', 
'inner_key6' : '5', 
'inner_key7' : '2', 
'inner_key8' : '8', 
'inner_key9' : '10'}, 
... 
'mmc-2/bbc-1': { 
'inner_key1' : '1', 
'inner_key2' : '4', 
'inner_key3' : '3', 
'inner_key4' : '5', 
'inner_key5' : '7', 
'inner_key6' : '5', 
'inner_key7' : '2', 
'inner_key8' : '0', 
'inner_key9' : '10'}} 

そこで私は、BBC IDが条件であり、MMC-2/BBC-1およびMMC-3/BBC-1とわずかMMC-1/BBC-1を比較する必要が。 これらはdictのキーです。 私は

.split('/')[1].split('-')[1] 

でキーを分割するしかし、どのように同じBBCとのちょうど辞書比較するための条件を作るためには考えていることはできません。 これは、新しい辞書に比較して差を入れるコードですが、すべてのキーで行います.bbc idのメーターではありません。これを変更する必要があります。 objDictはオブジェクトの私のdictです。refdは参照オブジェクトを持つdictです。上の例の最初のオブジェクトをrefオブジェクトとして取ります。

#Choose reference object 
ref = tempdict['mmc-1/bbc-1'] 
m_dif = {} 

#Main function for finding differences 
for obj, objDict in tempdict.iteritems(): 
    currentDict = {} 

    # Check if the keys match. 
    if objDict.keys() != ref.keys(): 
     for key in ref: 
      if key not in objDict.keys(): 
       currentDict[key] = None 

     for key in objDict: 
      if key not in ref.keys(): 
       # Store unexpected values in object. 
       currentDict[key] = None 

    # Check if values are the same. 
    for k, v in objDict.iteritems(): 
     # Check if the key is in ref to avoid error 
     if k in ref: 
      # Then compare if values are equal 
      if ref[k] != objDict[k]: 
       # Make actual diff 
       currentDict[k] = v 
    # Store differences for current object against object title. 
    m_dif[obj] = currentDict 

わかりやすい質問ではありませんが、混乱していることを教えてください。私は説明します。他のすべてのBBC IDの

{'mmc-2/bbc-1': { 
'inner_key5' : '7'}} 

と同じこと:

はのは、その参照は、BBCのID = 1 所望の出力を持つオブジェクトに対してMMC-1/BBC-1であると仮定しましょう。このコードは、bbc idがどんなものであれ、すべてのオブジェクトに対してただ一つのrefがあれば、完璧に動作します。

+1

あなたが関連するオブジェクトのサブサンプルを提供した場合に役立ちます - あなたの 'dict'や、Pythonの構文で見えるものを真実に見せてください(私は現在、どのビットがキーか、何の値)。次に、出力がどのようなものであるべきか(そして何をするのに苦労しているのか)の小さなサンプルを提供してください。これは、よく知られていない用語を使用するよりも、問題を伝えるもっと簡単な方法です。 –

+0

@ IzaakvanDongen私は少し質問を編集しました。 – jovicbg

+0

あなたの問題を示すrunnableを与えてください。(そして、問題を元に戻してください。あなたの実際の問題に無関係な詳細がたくさんあるようです...) – thebjorn

答えて

0

(あなたの質問の私の作業の解釈である)「一緒にグループ同じBBCの値を持つキー」あなたができるものがいくつかありますするには:私はかなりを追加しました

import pprint 

from collections import defaultdict 

max_mmc = 10 
max_bbc = 3 

data = {"mmc-{}/bbc-{}".format(a, b): a * 10 ** b for a in range(max_mmc) 
                for b in range(max_bbc)} 

pprint.pprint(data) 

# approach where you already know the maximum id of bbc and mmc 

result_1 = {"bbc-{}".format(bbc): [data["mmc-{}/bbc-{}".format(mmc, bbc)] 
            for mmc in range(max_mmc)] 
            for bbc in range(max_bbc)} 

# approach where you don't know the maximums 

result_2 = defaultdict(list) 

for k, v in data.items(): # items because of Python 3 
    mmc, bbc = k.split("/") 
    result_2[bbc].append(v) 

pprint.pprint(result_1) 
pprint.pprint(result_2) 

がここにあなたのデータの短く境界のないPEP-8に準拠したモックアップ - キーのサブセットが再作成され、各値はmmcとbbcの厳密な "ハッシュ"バージョンです。これにより、後で適切に機能していることがわかります。 (すなわち、bbc-2によるグループ分けはすべて100の倍数をもたらすはずです)。それはまた、thebjornが話していた混乱の多くを取り除きます。

コードには2つの方法があります。データについてどれだけ知っているかによってコードが変わります。最初のアプローチはより効率的になります。このコードは、キーのリストを生成しますが、私はあなたがそれらで何をしたいのかが分かりませんが、このアプローチは、あなたがグループでやりたいことにも適用可能です。

どちらの場合も、グループ化された値(vまたはdata[...])にただちにアクセスして変更するか、遡及的にリストを参照してさらに操作を行うことができます。

これは、次の出力があります。

{'mmc-0/bbc-0': 0, 
'mmc-0/bbc-1': 0, 
'mmc-0/bbc-2': 0, 
'mmc-1/bbc-0': 1, 
'mmc-1/bbc-1': 10, 
'mmc-1/bbc-2': 100, 
'mmc-2/bbc-0': 2, 
'mmc-2/bbc-1': 20, 
'mmc-2/bbc-2': 200, 
'mmc-3/bbc-0': 3, 
'mmc-3/bbc-1': 30, 
'mmc-3/bbc-2': 300, 
'mmc-4/bbc-0': 4, 
'mmc-4/bbc-1': 40, 
'mmc-4/bbc-2': 400, 
'mmc-5/bbc-0': 5, 
'mmc-5/bbc-1': 50, 
'mmc-5/bbc-2': 500, 
'mmc-6/bbc-0': 6, 
'mmc-6/bbc-1': 60, 
'mmc-6/bbc-2': 600, 
'mmc-7/bbc-0': 7, 
'mmc-7/bbc-1': 70, 
'mmc-7/bbc-2': 700, 
'mmc-8/bbc-0': 8, 
'mmc-8/bbc-1': 80, 
'mmc-8/bbc-2': 800, 
'mmc-9/bbc-0': 9, 
'mmc-9/bbc-1': 90, 
'mmc-9/bbc-2': 900} 

{'bbc-0': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
'bbc-1': [0, 10, 20, 30, 40, 50, 60, 70, 80, 90], 
'bbc-2': [0, 100, 200, 300, 400, 500, 600, 700, 800, 900]} 

defaultdict(<class 'list'>, 
      {'bbc-0': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
      'bbc-1': [0, 10, 20, 30, 40, 50, 60, 70, 80, 90], 
      'bbc-2': [0, 100, 200, 300, 400, 500, 600, 700, 800, 900]}) 

私たちは、結果が正しく両方のケースでグループ化されていることがわかります。 dictを使うことができるものには、defaultdictを使うことができます。新しいキーが満たされたときにリストを作成するためだけに使用されます。

あなたのデータのソースにアクセスできない場合は、このような何かが必要です。しかし、もしあなたがそれを全く変更することができれば、ネストされた辞書/リストのようなものは(インデックスが連続しているので)あなたの人生をもっと楽にしてくれるでしょう。

関連する問題