检查字典中是否存在特定的Key和值

时间:2014-09-07 15:08:33

标签: python dictionary

我正在尝试确定字典中是否存在特定的键和值对;但是,如果我使用contains或has-key方法,它只会检查密钥。我需要它来检查密钥和特定值。一些背景: 我们总共有4个词典:一个用于A,B,CompareList和ChangeList。一旦A被初始化,我将A的内容放入CompareList(我会直接比较它们;但A和B是双哈希表。我已经尝试了所有这些方法;但它们都不适用于我)。所以一旦我们将A放入CompareList,我将它与B中的ObjectAttributes字典进行比较,看看是否有任何改变。因此,例如,B可能具有键,值对形状:圆和填充:否。如果CompareList有形状:circle和fill:yes,那么我只想填充:yes是ChangeList。问题出在" if属性.getName()不在self.CompareList中:"线。这是代码;我在Python 2.7.8上运行它。提前感谢您的帮助!!

class ObjectSemanticNetwork:
    def __init__(self):
        self.ObjectNames = {}
        self.ObjectAttributes = {}

    def setName(self, name):
        self.ObjectNames[name] = self.ObjectAttributes

    def setData(self, name, attribute):
        self.ObjectAttributes[name] = attribute

    def checkData(self, key):
        print(key)
        for key, value in self.ObjectAttributes.iteritems():
            print(key)
            print(value)
            print("\n")
class Agent:
(self):
        self.CompareList = {}
        self.ChangeListAB = {}
        self.ChangeListCD = {}

    def addToCompareList(self, name, value):
        self.CompareList[name] = value

    def addToChangeListAB(self, name, value):
        self.ChangeListAB[name] = value

    def addToChangeListCD(self, name, value):
        self.ChangeListCD[name] = value

    def CheckList(self, List, ListName):
        print '-------------------------',ListName,'--------------------------------'
        for key, value in List.iteritems():
            print(key)
            print(value)

    def Solve(self,problem):
        OSNAB = ObjectSemanticNetwork()
        for object in problem.getFigures().get("A").getObjects():
            for attributes in object.getAttributes():
                self.addToCompareList(attributes.getName(), attributes.getValue())
                OSNAB.ObjectNames["A"] = OSNAB.setData(attributes.getName(), attributes.getValue())
        #OSNAB.checkData("A")
        self.CheckList(self.CompareList,"CompareList")

        for object in problem.getFigures().get("B").getObjects():
            for attributes in object.getAttributes():
                if attributes.getName() not in self.CompareList:
                    self.addToChangeListAB(attributes.getName(), attributes.getValue())
                OSNAB.ObjectNames["B"] = OSNAB.setData(attributes.getName(), attributes.getValue())
        # OSNAB.checkData("B")
        self.CheckList(self.ChangeListAB,"ChangeList")

        OSNCD = ObjectSemanticNetwork()
        for object in problem.getFigures().get("C").getObjects():
            for attributes in object.getAttributes():
                OSNCD.ObjectNames["C"] = OSNCD.setData(attributes.getName(), attributes.getValue())
        # OSNCD.checkData("C")

        for object in problem.getFigures().get("1").getObjects():
            for attributes in object.getAttributes():
                OSNCD.ObjectNames["D"] = OSNCD.setData(attributes.getName(), attributes.getValue())
        # OSNCD.checkData("D")

        return "6"

3 个答案:

答案 0 :(得分:5)

使用

if key in d and d[key] == value:

或(仅限Python 3)

if (key, value) in d.items():

在Python 3 d.items()中返回Dictionary view object,它支持快速成员资格测试。在Python 2 d.items()中返回一个列表,该列表创建缓慢且测试成员资格的速度很慢。 Python 2.7是一个特殊情况,您可以使用d.viewitems()并获得与Python 3中d.items()相同的内容。

修改:在评论中,您指出出于性能原因,您希望checkKeyValuePairExistence优先于key in d and d[key] == value。下面是一些时间显示checkKeyValuePairExistence总是较慢(当键值对存在时,我的系统大约是2倍,否则为16倍)。我还测试了越来越大的字典,发现时间上的变化很小。

>>> import random
>>> from timeit import timeit
>>> def checkKeyValuePairExistence(dic, key, value):
...     try:
...         return dic[key] == value
...     except KeyError:
...         return False
...
>>> d = {random.randint(0, 100000):random.randint(0, 100000) for i in range(1000)}
>>> setup = 'from __main__ import k, d, v, checkKeyValuePairExistence'
>>> test_try_except = 'checkKeyValuePairExistence(d, k, v)'
>>> test_k_in_d_and = 'k in d and d[k] == v'
>>> k, v = random.choice(d.items()) # to test if found
>>> timeit(test_try_except, setup=setup)
0.1984054392365806
>>> timeit(test_k_in_d_and, setup=setup)
0.10442071140778353
>>> k = -1 # test if not found
>>> timeit(test_try_except, setup=setup)
1.2896073903002616
>>> timeit(test_k_in_d_and, setup=setup)
0.07827843747497809 

答案 1 :(得分:1)

这个功能怎么样:

def checkKeyValuePairExistence(dic, key, value):
    try:
        return dic[key] == value
    except KeyError:
        return False

如果您正在使用其他类型的字典,那么一个python提供(对不起,如果您使用或不使用,我无法从您的帖子中理解)然后让我知道并且我会尝试给你另一个解决方案

答案 2 :(得分:-1)

为什么不这样做:

a = {1:'a', 2:'b'}
b = (1, 'a')
print b in a.iteritems() # prints True