2013-06-28 4 views
0

У меня есть большой словарь, который я ищу, чтобы найти определенную строку. Ключами для словаря являются числа, а затем значения являются кортежами. Как создать функцию для циклического перехода через словарь, используя поиск без учета регистра, а затем взять ключи, содержащие соответствующую фразу, и добавить их в новый список? Я хотел бы использовать этот новый список [match] в следующей функции (show), которую я создал для печати информации.Нечувствительный к регистру строковый поиск словаря

Мой код выглядит следующим образом:

dict = { 
1 : (value,value,value), 
2 : (value,value,value), 
so on... 
} 
# searches dict, criteria determines whether search is for str() or int(), phrase is string I am searching for 
def search(criteria,phrase): 

    enter code here 

# prints new list 
def show(match): 
+0

Ваша идея звучит как хорошее решение, да. –

+0

Как бы вы предложили это сделать? Мой код для словаря выглядит следующим образом: ДИКТ = { ключ: (значение, значение, значение), ключ: (значение, значение, значение), ... так далее } –

+0

Я не могу видеть ваш код, добавьте его в редактирование своего сообщения! –

ответ

0

Что-то, как это должно работать! Он работает в O (N) времени, поэтому он не будет получать лучше :)

phrase = phrase.lower() # the matching value made lowercase (case insensitivity) 
matches = [] 

lowerDict = {} # makes the dict lowercase 
for key in dictionary: 
    lowerDict[key] = [s.lower() for s in dictionary[key]] 

for key in lowerDict: 
    if phrase in lowerDict[key]: 
    matches.append(key) 

for match in matches: 
    print(dictionary[match]) 
+0

Это именно то, что я ищу, за исключением случаев, когда я пытаюсь запустить его. Python дает мне ошибку атрибута. Поскольку ключ является типом данных int, он говорит мне, что он не имеет атрибута «lower» –

+0

Но s не является int. Это действительно «ценность», если вы правильно определили свои данные. –

2

Вы хотите использовать list comprehension:

>>> d = {1: ("one", "two", "three"), 2: ("four", "five", "six")} 
>>> [i for i, j in d.items() if 'two' in j] 
[1] 

как функция:

def search(criteria, phrase): 
    return [i for i, j in criteria.items() if phrase in j] 
+0

Скорее: '... в j.lower()'. – Tadeck

+0

@Tadeck Вопрос немного неясен на данном этапе, поэтому я буду ждать ответа OP. – TerryA

+0

Вы правы. Моя коррекция была основана на заголовке («_Case нечувствительный строковый поиск словаря»), но это стоит уточнить. Я также думаю, что значения - это строки, а не кортежи строк - это предположение. – Tadeck