25

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

假设我想搜索字典值中是否存在字符串 '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' 的子字符串)。

4

11 回答 11

37

你可以这样做:

#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
于 2013-06-27T10:44:31.933 回答
13

我有点晚了,但另一种方法是使用列表理解和any函数,它接受一个可迭代并True在一个元素为时返回True

# Checking if string 'Mary' exists in the lists of the dictionary values
print any(any('Mary' in s for s in subList) for subList in myDict.values())

如果您想计算其中包含“玛丽”的元素数量,您可以使用sum()

# Number of sublists containing 'Mary'
print sum(any('Mary' in s for s in subList) for subList in myDict.values())

# Number of strings containing 'Mary'
print sum(sum('Mary' in s for s in subList) for subList in myDict.values())

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

要获取包含“Mary”的密钥:

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

要获取子列表:

def matchingValues(dictionary, searchString):
    return [val for val in dictionary.values() if any(searchString in s for s in val)]

要获取字符串:

def matchingValues(dictionary, searchString):
    return [s for s i for val in dictionary.values() if any(searchString in s for s in val)]

要同时获得:

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

如果你只想得到包含“Mary”的字符串,你可以做一个双重列表理解:

def matchingStrings(dictionary, searchString):
    return [s for val in dictionary.values() for s in val if searchString in s]
于 2020-05-16T22:09:23.957 回答
9

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')
于 2013-06-27T11:05:52.790 回答
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
于 2013-06-27T11:07:10.607 回答
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']
于 2013-06-27T10:51:37.447 回答
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 使列表全局可用
  • 如果在任何值中找到匹配的子字符串,则该值的键将附加到
于 2017-11-01T11:05:02.643 回答
1

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

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
于 2018-02-15T10:28:41.340 回答
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
于 2013-06-28T18:43:29.353 回答
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

如果研究涉及更多键,也许您应该创建一个包含所有键的列表

于 2015-03-09T17:49:19.203 回答
0

为使用这篇文章的其他人提供更通用的解决方案来进行类似或更复杂的 python 字典搜索:您可以使用dictpy

import dictpy

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

search = dictpy.DictSearch(data=myDict, target='Mary-Ann')
print(search.result)   # prints -> [firstName.1, 'Mary-Ann']  

列表中的第一个条目是目标位置:字典键“firstName”和列表中的位置 1。第二个条目是搜索返回对象。

这样做的好处dictpy是它可以找到多个“Mary-Ann”,而不仅仅是第一个。它告诉您找到它的位置,您可以搜索更复杂的字典(更多级别的嵌套)并更改返回对象是什么。

于 2021-10-17T20:31:57.470 回答
-3

如果找到,则在 json.dumps(myDict) 中导入 json 'mtach' 为真

于 2019-01-09T21:21:20.330 回答