如何搜索字典值是否包含Python的某些字符串

时间:2013-06-27 10:38:26

标签: python string dictionary key-value

我有一个带键值对的字典。我的值包含字符串。如何搜索字典中是否存在特定字符串,并返回与包含该值的键对应的键。

假设我想搜索字典值中是否存在字符串'Mary'并获取包含它的键。这是我尝试过的,但显然不会那样。

#Just an example how the dictionary may look like
myDict = {'age': ['12'], 'address': ['34 Main Street, 212 First Avenue'],
          'firstName': ['Alan', 'Mary-Ann'], 'lastName': ['Stone', 'Lee']}

#Checking if string 'Mary' exists in dictionary value
print 'Mary' in myDict.values()

有没有更好的方法来执行此操作,因为我可能想要查找存储值的子字符串('Mary'是值'Mary-Ann'的子字符串)。

10 个答案:

答案 0 :(得分:30)

你可以这样做:

#Just an example how the dictionary may look like
myDict = {'age': ['12'], 'address': ['34 Main Street, 212 First Avenue'],
      'firstName': ['Alan', 'Mary-Ann'], 'lastName': ['Stone', 'Lee']}

def search(values, searchFor):
    for k in values:
        for v in values[k]:
            if searchFor in v:
                return k
    return None

#Checking if string 'Mary' exists in dictionary value
print search(myDict, 'Mary') #prints firstName

答案 1 :(得分:5)

Klaus解决方案的开销较小,另一方面,这个解决方案可能更具可读性

myDict = {'age': ['12'], 'address': ['34 Main Street, 212 First Avenue'],
          'firstName': ['Alan', 'Mary-Ann'], 'lastName': ['Stone', 'Lee']}

def search(myDict, lookup):
    for key, value in myDict.items():
        for v in value:
            if lookup in v:
                return key

search(myDict, 'Mary')

答案 2 :(得分:4)

import re
for i in range(len(myDict.values())):
     for j in range(len(myDict.values()[i])):
             match=re.search(r'Mary', myDict.values()[i][j])
             if match:
                     print match.group() #Mary
                     print myDict.keys()[i] #firstName
                     print myDict.values()[i][j] #Mary-Ann

答案 3 :(得分:2)

>>> myDict
{'lastName': ['Stone', 'Lee'], 'age': ['12'], 'firstName': ['Alan', 'Mary-Ann'],
 'address': ['34 Main Street, 212 First Avenue']}

>>> Set = set()

>>> not ['' for Key, Values in myDict.items() for Value in Values if 'Mary' in Value and Set.add(Key)] and list(Set)
['firstName']

答案 4 :(得分:2)

对我来说,这也有效:

def search(myDict, search1):
    search.a=[]
    for key, value in myDict.items():
        if search1 in value:
            search.a.append(key)

search(myDict, 'anyName')
print(search.a)
  • search.a使列表全局可用
  • 如果在任何值中找到子串的匹配,则为其关键字 值将被附加到

答案 5 :(得分:2)

我来晚了一点,但是另一种方法是使用列表理解并检查结果的长度:

#Checking if string 'Mary' exists in dictionary value
print len([val for key,val in myDict if 'Mary' in val]) > 0

在这里,我实际上列出了包含'Mary'的每个值的列表,并检查是否包含一些值。我们也可以使用sum()

#Checking if string 'Mary' exists in dictionary value
print sum(1 for key,val in myDict if 'Mary' in val) > 0

第二种方法已经过优化,因为它在计算长度之前不存储列表。 (差异在很多元素上都是显着的,但是在这里您应该看不到任何重要的差异)

通过这些方法,我们可以轻松地创建函数以检查哪些键或值匹配。

要获取密钥:

def matchingKeys(dictionary, searchString):
    return [key for key,val in dictionary if searchString in val]

要获取值:

def matchingValues(dictionary, searchString):
    return [val for key,val in dictionary if searchString in val]

要同时获得两者:

def matchingElements(dictionary, searchString):
    return {key:val for key,val in dictionary if searchString in val}

仅获取元素数量:

def matchingNumber(dictionary, searchString):
    return sum(1 for key,val in dictionary if searchString in val)

答案 6 :(得分:0)

import re
for i in range(len(myDict.values())):
    for j in range(len(myDict.values()[i])):
         match=re.search(r'Mary', myDict.values()[i][j])
         if match:
                 print match.group() #Mary
                 print myDict.keys()[i] #firstName
                 print myDict.values()[i][j] #Mary-Ann

答案 7 :(得分:0)

def search(myDict, lookup):
    a=[]
    for key, value in myDict.items():
        for v in value:
            if lookup in v:
                 a.append(key)
    a=list(set(a))
    return a

如果研究涉及更多密钥,您可能应该创建一个包含所有密钥的列表

答案 8 :(得分:0)

以下是接受答案的一个班轮...(对于一线爱好者......)

def search_dict(my_dict,searchFor):
    s_val = [[ k if searchFor in v else None for v in my_dict[k]] for k in my_dict]    
    return s_val

答案 9 :(得分:-2)

导入json json.dumps(myDict)中的“ mtach” 找到就为真