2016-05-02 6 views
0

Für eine Übung muss ich eine kleinste Teilmenge von Proteomen bestimmen, die alle gegebenen Proteine ​​enthalten. Die Objekte, mit denen ich arbeiten kann, sehen so aus:Suche nach einer minimalen Teilmenge von Schlüsseln aus einem Listenwörterbuch

Ein Wörterbuch mit Listen, das die Proteom-ID als Schlüssel und eine Liste von Protein-IDs von Proteinen enthält, die darin enthalten sind. Ich habe auch eine Reihe von Protein-IDs. Mehrere Proteome können die gleichen Protein-IDs haben.

Frage: Finden Sie die kleinste Untergruppe von Proteomen, die alle im Array deklarierten Proteine ​​enthält.

Visualisierung:

Wörterbuch der Listen

{'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']}

Array

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

Die Ausgabe sollte in diesem Beispiel sein

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

freundlichen Grüßen

+0

Was haben Sie schon versucht? Treten beim Codieren Probleme auf? Nach der Arbeitslösung zu fragen ist nicht das, was SO für –

+0

ist, und ich habe eine gierige Methode ausprobiert, die das Array iteriert und nach dem ersten Schlüssel mit dem richtigen Wert sucht. Dies wird mir jedoch offensichtlich nicht die kleinere Teilmenge und nicht nur eine Teilmenge geben. Ich möchte einige Ideen bekommen, wie ich dieses Problem angehen kann. – user3620381

Antwort

0

Ohne Verwendung anhängen und Methoden in for-Schleifen zu vermeiden ...

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

Danke für Ihre Mühe. Es funktioniert jedoch nicht mit mehreren Schlüsseln mit einem gemeinsamen Wert. Wenn zum Beispiel ''A0A0T9PBK6'' auch in '' UP000001592' 'auftritt, möchte ich nur' 'UP000001592'' anstelle von beiden ausgeben. – user3620381

+0

so update Ihre Eingabe, ich denke schneller am Eingang + Ausgang als auf blablabla: P –

Verwandte Themen