2015-04-15 2 views
1

Допустим, у меня был словарь с некоторыми парами значений: значение. Вместо того, чтобы переопределять словарь, есть ли способ проверить, что-то похоже на какой-то ключ в словаре?Python словари: любой способ проверить «аналогичный» ключ?

Для примера

items = [ 'green apple', 'yellow pepper', 'green pepper', 'red pepper' ] 
fruitsandveggies = { 'apple': 2, 'banana': 5, 'pepper': 6} 
for item in items:   
    if item is similar to some key in fruitsandveggies ('green apple' is similar to 'apple', 
    set qty = value of that key 
    then print that qty 

Чтобы прояснить некоторые вопросы, что я имею в виду похож просто содержащий «ключ» в строке. Итак, «крабовое яблоко», «зеленое яблоко», «ямочное яблоко» содержат в себе «яблоко», которое является одним из ключей.

+0

Как выглядит «зеленое яблоко», похожее на яблоко? Если имя coz, то что насчет 'соснового яблока'? –

+6

Определите похожие. Если «перец» похож на «зеленый перец», значит, «зеленый перец» тоже похож на «перец»? «Зеленый перец» похож на «зеленое яблоко»? Является ли «оранжевый» похожим на «оранжевый перец»? –

+0

Да, но вы должны быть более конкретными в отношении того, что считается «похожим». Считается ли «крабовое яблоко» похожим? Учитывается ли «Манзана» (испанский язык для яблока)? «Яблоки» или «aple» считаются похожими «Как насчет« Apple »или« APPLE »? – Brionius

ответ

1

Вы можете использовать difflib.SequenceMatcher.ratio(), который вернет меру сходства последовательностей как поплавок в диапазоне [0, 1].

И max функция:

>>> fruitsandveggies = { 'apple': 2, 'banana': 5, 'pepper': 6} 
>>> max(fruitsandveggies.items(),key=lambda (i,j):difflib.SequenceMatcher(None, i,'green apple').ratio()) 
('apple', 2) 

Если вы просто хотите, чтобы получить значение с помощью простой индексации ([1])

0

Если я правильно понимаю, я думаю, что это то, что вы хотите сделать:

import re 

items = [ 'green apple', 'yellow pepper', 'green pepper', 'red pepper' ] 
fruitsandveggies = { 'apple': 2, 'banana': 5, 'pepper': 6} 
for key in fruitsandveggies.keys(): 
    fruitsandveggies[key] = 0 
    for item in items: 
     if re.search(key, item): # if it finds the key string in the item 
      fruitsandveggies[key] += 1 
    #print str(fruitsandveggies[key]) + ' ' + key #python 2 
    print(str(fruitsandveggies[key]) + ' ' + key) #python 3 

он напечатает

3 перца 1 яблоко 0 банан

в этом примере

+0

Вы можете выполнить 'print (fruitsandveggies [key], key)' a nd избегать всех типов литья –

+0

Если вызов 're.search (...)' остается таким же простым, как вы, вы можете заменить его 'in'. В противном случае вы должны реализовать вещи как 're.IGNORECASE', я думаю. – TidB

0
for i in items: 
    if any(key in i for key in fruitsandveggies.keys()): 
     print key # or print fruitsandveggies[key] 
0

Я не знаю, если я получил свой вопрос прямо, но следующий способ проверить элементы для строк, подобных ключей словаря :

for key in fruitsandveggies: 
    if any(key in item for item in items): 
     qty = fruitsandveggies[key] 
     print(qty)