字典键中的多值搜索

时间:2015-01-01 20:49:16

标签: python python-3.x dictionary

Iterating over dict values - 与此问题相关:

def bla(self,x,y)   
    for i in self.DataBase.keys():
        for x,y in self.DataBase[i]:
            if x == dept and y == year:
                return self.DataBase[i]

这是我想要实现的更多想法,如何获取密钥并在密钥中搜索n个值,然后如果值在密钥中则返回密钥

3 个答案:

答案 0 :(得分:3)

下面,方法bla返回数据库键,如果x和y分别匹配与键对应的元组的第一个和第二个元素(任何长度):

def bla(self, x, y)   
    for key, value in self.DataBase.iteritems():
        if (x, y) == value[:2]:
            return key

现在在下面,如果作为元组的数据库值同时包含x和y,方法bla将返回数据库密钥:

def bla(self, x, y)   
    for key, value in self.DataBase.iteritems():
        if x in value and y in value:
            return key

答案 1 :(得分:2)

由于您在问题中说“返回密钥”,我假设您实际上想要隔离字典中的键,其值与某些搜索参数集匹配(您发布的代码片段返回值,而不是键)。假设self.Database是一个字典,您可以将键提取为列表理解,如下所示:

def getMatchingKeys(self, x, y):
  '''Extract keys whose values contain x and y (position does not matter)'''
  return [i for i in self.Database if x in self.Database[i] and y in self.Database[i]]

将返回其值包含元组中任何位置的x和y的键。如果需要匹配元组中的特定位置,则理解中的条件可以更改为if x == self.Database[i][1] and y == self.Database[i][2]

如果您没有使用钥匙,请澄清您的问题。

答案 2 :(得分:1)

您可以使用内置map()来设置xy变量。

def bla(self,x,y) :
    for key in self.DataBase :
        x,y = map(float, self.DataBase[key])
        if x == dept and y == year:
            return key

如果您更喜欢使用items(),您也可以执行以下操作(同样有效):

def bla(self,x,y):
    for key, val in self.DataBase.items():
        x, y = map(float, val)
        if x == dept and y == year:
            return key

这是另一种没有map()的方法,这样你就可以在迭代dict时解包元组:

 def bla(self,x,y):
    for key, (x, y) in self.DataBase.items():
        if x == dept and y == year:
            return key

您也可以使用列表理解来编写上面的内容,尽管我会说上面的那个更好:

def bla(self,x,y):
    found = {key for key, (x, y) in self.DataBase.items() if x==dept and y==year}
    found = ''.join(num) #joins set into string
    return found

以下是Python 3的所有工作,我认为这是你想要的,因为你的一个标签是Python 3.x