Как искать, если значение словаря содержит определенную строку с Python

У меня есть словарь с ключом-значением. Мое значение содержит строки. Как я могу выполнить поиск, если в словаре существует определенная строка, и вернуть ключ, соответствующий ключу, содержащему это значение.

Скажем, я хочу искать, если строка "Мэри" существует в значении словаря и получить ключ, который ее содержит. Это то, что я пытался, но очевидно, что это не работает.

#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" ).

Ответ 1

Вы можете сделать это следующим образом:

#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

Ответ 2

Решение Клауса имеет меньшие накладные расходы, с другой стороны, это может быть более читаемым

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')

Ответ 3

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

Ответ 4

>>> 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']

Ответ 5

Для меня это также сработало:

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 делает список доступным во всем мире
  • если совпадение подстроки найдено в любом значении, ключ этого значение будет добавлено к

Ответ 6

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

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

Ниже приведен один лайнер для принятого ответа... (для любителей одной строки..)

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

импорт json 'mtach' в json.dumps(myDict) имеет значение true, если найдено