是否可以一次迭代多个Dict键?

时间:2019-07-26 20:24:11

标签: python dictionary tuples iteration

我正在研究一个在线MOOC时遇到的一个问题,我正在编写一个可以获取药物列表并查看病毒列表中的哪种病毒对所有药物具有抗药性的功能。

我已经使用标志解决了它,但是我正在尝试寻找其他方法来解决它。 我想到的一种方法是,如果可能的话,一次全部使用毒品列表作为关键字,并以列表的形式获取值,这显然是行不通的(搜索后发现我无法使用列表)作为字典键)。 所以我的问题是:是否可以将iterable用作dict键,而该iterable的每个元素都是dict的单独键?

我曾尝试使用没有运气的列表,但我知道可以将元组作为dict键,但前提是元组本身是一个唯一键,而不是它的元素。

这是我想到的功能:

def getResistPop(self, drugResist):
        """
        Get the population of virus particles resistant to the drugs listed in
        drugResist.       

        drugResist: Which drug resistances to include in the population (a list
        of strings - e.g. ['guttagonol'] or ['guttagonol', 'srinol'])

        returns: The population of viruses (an integer) with resistances to all
        drugs in the drugResist list.
        """

        totalPop = 0
        for v in self.viruses:
            if all(v.resistances[drugResist]):
                totalPop += 1

这是我最好不要使用标志的方法。 但是,当然,这将行不通,并给出一个错误:列表不能用作字典键。 我想知道是否有可能这样做。 谢谢!

编辑:根据@Yongkang Zhao的要求,以下是一些示例数据:

测试运行中包含以下信息:

virus1 = ResistantVirus(1.0, 0.0, {"drug1": True}, 0.0)
virus2 = ResistantVirus(1.0, 0.0, {"drug1": False, "drug2": True}, 0.0)
virus3 = ResistantVirus(1.0, 0.0, {"drug1": True, "drug2": True}, 0.0)
patient = sm.TreatedPatient([virus1, virus2, virus3], 100)
patient.getResistPop(['drug1']): 2
patient.getResistPop(['drug2']): 2
patient.getResistPop(['drug1','drug2']): 1
patient.getResistPop(['drug3']): 0
patient.getResistPop(['drug1', 'drug3']): 0
patient.getResistPop(['drug1','drug2', 'drug3']): 0

调用getResistPop的每一行之后的数字是抵抗所有所用药物的预期病毒数量。

1 个答案:

答案 0 :(得分:1)

您建议的函数已关闭,只是您没有正确使用all()

def getResistPop(self, drugResist):
    """<trimmed>"""

    totalPop = 0
    for v in self.viruses:
        if all(x in v.resistances for x in drugResist):
            totalPop += 1

要弄清楚-在这种情况下,您并不是真正地一次迭代多个dict键,而是检查每种病毒是否在该病毒的抗药性集中找到了所有药物。