Як шукати, якщо словник містить певний рядок з Python

У мене є словник з парою ключ-значення. Моє значення містить рядки. Як я можу шукати, чи існує певна рядок у словнику та повертає ключ, що відповідає ключові, що містить значення.

Скажімо, я хочу шукати, чи існує рядок "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-Ann").

10

8 Відповіді

Ви можете зробити це так:

#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
27
додано
Крім того, якщо ви знаєте, що словник величезний, ви можете перетворити його в JSON і виконати пошук регулярного виразу, наприклад pattern = r '\ w + (? = ": [\ S \ s] [^:] + {} ) ". (формат пошуку_тексту) , щоб отримати ключ.Це не буде швидше для невеликих словників, але буде для більших, особливо коли дані перебувають у гіршому випадку
додано Автор Erik, джерело
що буде проблемою продуктивності в цьому, якщо припустимо, що у мене є 1 мільйон записів, і я реалізую це для автоматичного завершення пошуку.
додано Автор Chetan Sharma, джерело
@ Невідомо Не обов'язково робити це для вашої справи. Вам потрібно індексувати значення в окремому словнику зі зворотним пошуком.
додано Автор wisbucky, джерело

Розчин Клауса має менше накладних витрат, з іншого боку, це може бути більш читабельним

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')
5
додано
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']
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 робить список глобальним доступним
  • якщо знайдено відповідність підстроки в будь-якому значенні, ключ від нього значення буде додано до
2
додано
Я тільки що дізнався, що пошук.a не є розумним способом зробити глобально доступним. В даний час це працює, це може допомогти: python-textbok.readthedocs.io/en /1.0/Variables_and_Scope.htm‌ l
додано Автор Shushiro, джерело
Рішення знайдено за допомогою: python "> stackoverflow.com/questions/7129285/…
додано Автор Shushiro, джерело
Def пошук (myDict, search1): a = [] для ключових значень у myDict.items (): якщо пошук1 в значенні: a.append (key) return ax = пошук (myDict, 'anyName') print (str (x ))
додано Автор Shushiro, джерело
Def пошук (myDict, search1): a = [] для ключових значень у myDict.items (): якщо пошук1 в значенні: a.append (key) return ax = пошук (myDict, 'anyName') print (str (x ))
додано Автор Shushiro, джерело
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
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

якщо дослідження передбачає більше ключів, можливо, ви повинні створити список з усіма ключами

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
0
додано
:) тільки одна лінія всередині функції ..
додано Автор shantanu pathak, джерело
це 3 рядки ...
додано Автор MazeOfEncryption, джерело
Ах, гоча. Ви можете зробити це в одному рядку, подібному до цього: search_dict = lambda x, y: ((k якщо y у v else для v у x [k]) для k в x)
додано Автор MazeOfEncryption, джерело
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;