2016-05-02 15 views
0

練習のためには、与えられたすべてのタンパク質を含むプロテオームの最小サブセットを決定する必要があります。私が働くことができるオブジェクトは、次のように見えます。リストの辞書からキーの最小サブセットを見つける

プロテオームIDをキーとし、そこに含まれるタンパク質のタンパク質IDのリストを持つリストの辞書です。私はまた、タンパク質IDの配列を持っています。複数のプロテオームは、同じタンパク質IDを有することができる。

質問:配列に宣言されているすべてのタンパク質を含むプロテオームの最小サブセットを検索します。

可視化:この例では出力が

でなければならないリスト

{'UP000040088': ['A0A0T9TGA2', 'A0A0T9PBK6'],'UP000005347': ['I2WKK5', 'I2W7Q9', 'I2WH23', 'I2W8G3', 'I2W8S8', 'I2WCH8', 'I2WCJ2', 'I2WA21', 'I2WC26', 'I2WCG9', 'I2W9F2', 'I2WKG5', 'I2W4G7', 'I2WCD6', 'I2WG92', 'I2W6I6', 'I2W648', 'I2WE51', 'I2WKU2', 'I2WIG4', 'I2WED9', 'I2WEM0', 'I2WB05', 'I2W998', 'I2W7Q9', 'I2WA37', 'I2WD89', 'I2WEB4', 'I2W4G7', 'I2W4B1', 'I2WIM9', 'I2WI84', 'I2WIS6', 'I2WES7', 'I2WGL9', 'I2WIA8', 'I2W7H0', 'I2WDB3', 'I2WE60', 'I2WC93', 'I2WC36', 'I2WC86', 'I2WC82', 'I2W6J9', 'I2W428', 'I2WCH8', 'I2WCJ2', 'I2W9T1', 'I2W9B9', 'I2WC26', 'I2WCG9', 'I2WA28', 'I2WA21', 'I2W648', 'I2WE51', 'I2WKU2', 'I2WIG4', 'I2WEM0', 'I2WED9', 'I2W9F2'], 'UP000001592': ['A9IMD2', 'A9IU64', 'A9IWM9', 'A9IWP5', 'A9IZ28', 'A9IZ30', 'A9IZ48', 'A9IZ71', 'A9IZ73', 'A9IZ75']}

アレイ

['A9IWM9', 'A9IWP5','A0A0T9PBK6']

辞書追加使用とループのためのメソッドを回避することなく

'UP000040088':['A0A0T9PBK6'],'UP000001592':['A9IWM9', 'A9IWP5']

よろしく

+0

あなたはすでに何を試してみましたか?コーディング時に問題にぶち当たっていますか?実際の解決策を求めているのは、まあ、 –

+0

のためではありません。私は配列を反復し、正しい値で最初のキーを検索する貪欲な方法を試しました。しかし、これは明らかに、サブセットではなく、より小さなサブセットを私に与えることはありません。私はこの問題にどのようにアプローチするかを考えていきたいと思っています。 – user3620381

答えて

0

を...

dct={'UP000040088': ['A0A0T9TGA2', 'A0A0T9PBK6'],'UP000005347': ['I2WKK5', 'I2W7Q9', 'I2WH23', 'I2W8G3', 'I2W8S8', 'I2WCH8', 'I2WCJ2', 'I2WA21', 'I2WC26', 'I2WCG9', 'I2W9F2', 'I2WKG5', 'I2W4G7', 'I2WCD6', 'I2WG92', 'I2W6I6', 'I2W648', 'I2WE51', 'I2WKU2', 'I2WIG4', 'I2WED9', 'I2WEM0', 'I2WB05', 'I2W998', 'I2W7Q9', 'I2WA37', 'I2WD89', 'I2WEB4', 'I2W4G7', 'I2W4B1', 'I2WIM9', 'I2WI84', 'I2WIS6', 'I2WES7', 'I2WGL9', 'I2WIA8', 'I2W7H0', 'I2WDB3', 'I2WE60', 'I2WC93', 'I2WC36', 'I2WC86', 'I2WC82', 'I2W6J9', 'I2W428', 'I2WCH8', 'I2WCJ2', 'I2W9T1', 'I2W9B9', 'I2WC26', 'I2WCG9', 'I2WA28', 'I2WA21', 'I2W648', 'I2WE51', 'I2WKU2', 'I2WIG4', 'I2WEM0', 'I2WED9', 'I2W9F2'], 'UP000001592': ['A9IMD2', 'A9IU64', 'A9IWM9', 'A9IWP5', 'A9IZ28', 'A9IZ30', 'A9IZ48', 'A9IZ71', 'A9IZ73', 'A9IZ75']} 

a = ['A9IWM9', 'A9IWP5','A0A0T9PBK6'] 

match={k:[None for _ in a] for k in dct.keys()} 

for k,lst in dct.items(): 
    n=0 
    for ai in a: 
     if ai in lst: 
      match[k][n]=ai 
     n+=1 

print match # {'UP000040088': [None, None, 'A0A0T9PBK6'], 'UP000005347': [None, None, None], 'UP000001592': ['A9IWM9', 'A9IWP5', None]} 

match={k:[vi for vi in v if not vi is None] for k,v in match.items()} 

print match # {'UP000040088': ['A0A0T9PBK6'], 'UP000005347': [], 'UP000001592': ['A9IWM9', 'A9IWP5']} 

match={k:v for k,v in match.items() if len(v)} 

print match # {'UP000040088': ['A0A0T9PBK6'], 'UP000001592': ['A9IWM9', 'A9IWP5']} 
+0

あなたの努力に感謝します。ただし、共有値を持つ複数のキーでは機能しません。たとえば、 '' A0A0T9PBK6 ''が '' UP000001592 ''にも現れた場合、私は両方の代わりに '' UP000001592''を返すだけです。 – user3620381

+0

あなたの入力を更新すると、blablablaよりも入力+出力が速くなります。P –

関連する問題