【问题标题】:Finding a minimal subset of keys from a dictionary of lists从列表字典中查找键的最小子集
【发布时间】:2016-05-02 13:44:45
【问题描述】:

对于一个练习,我必须确定包含所有给定蛋白质的蛋白质组的最小子集。我可以使用的对象如下所示:

以蛋白质组 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']

最好的问候

【问题讨论】:

  • 你已经尝试过什么?您在编码时遇到问题吗?寻求可行的解决方案并不是 SO 的目的
  • 好吧,我尝试了一种贪婪的方法,它迭代数组并搜索具有正确值的第一个键。然而,这显然不会给我更小的子集而不仅仅是一个子集。我想知道如何解决这个问题。

标签: python list dictionary subset


【解决方案1】:

在 for 循环中不使用 append 和避免方法...

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

【讨论】:

  • 感谢您的努力。但是,它不适用于具有共享值的多个键。例如,如果 'A0A0T9PBK6' 也出现在 'UP000001592' 中,我只想返回 'UP000001592' 而不是两者。
  • 所以更新你的输入,我在输入+输出上的思考速度比在 blablabla 上更快:P
猜你喜欢
  • 2014-03-02
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2013-11-06
相关资源
最近更新 更多