У меня есть словарь:

name = {'San Francisco':'California', 'Boise':'Idaho',
        'Kansas City': 'Missouri', 'Miami':'Florida'}

Я использую регулярное выражение, чтобы убрать любые числа в конце названия города (ниже), если это произойдет. Я хочу, чтобы, скажем, «Канзас-Сити1» был убран из «1», а затем оттуда сравниваем извлеченную строку с ключом в словаре, как только найдется совпадение, я бы хотел, чтобы оно вернуло значение, связанное с соответствующий ключ.

Это мой текущий код:

def abbrev(string):
   strip_string = re.sub(r'\d+', '', string)

   if(strip_string in name.keys()):
      initial = [value for value in name.values()][strip_string in name.keys()]
      return initial
   else:
      initial = string[:3]
      return initial

string = ("Kansas City1")
initial = abbrev(string) 
print(initial)

Так что, если Канзас-Сити1 должен дать Миссури, но код дает мне Айдахо по какой-то причине ... и я не знаю почему. Может ли кто-нибудь помочь мне понять это?

-2
tejosa 1 Май 2019 в 21:17

2 ответа

Проблема в вашей ссылке:

  initial = [value for value in name.values()][strip_string in name.keys()]

Ваш первый семестр - это новый список:

[value for value in name.values()]

Ваше значение индекса является логическим:

                  [strip_string in name.keys()]

Давайте посмотрим на это с помощью простого кода трассировки, печатая каждый термин:

if(strip_string in name.keys()):
    print ([value for value in name.values()])
    print ([strip_string in name.keys()])
    initial = [value for value in name.values()][strip_string in name.keys()]
    return initial

Выход:

['Idaho', 'California', 'Florida', 'Missouri']
[True]
California

В вашем коде очень четко написано, что нужно создать список из значений dict, а затем сообщить элемент [1] из этого списка. Вы проделали большую работу, чтобы убедиться, что вы получаете что-то, что не обязательно связано с вашим вкладом. Обратите внимание, что это вернет то же самое значение для любого ключа, который есть в dict.

Вместо этого вы знаете ключ: используйте его напрямую, так как другие уже включили в свои ответы.

initial = name[strip_string]
3
Prune 1 Май 2019 в 18:40

Просто сделайте initial = name[strip_string] вместо [value for value in name.values()][strip_string in name.keys()].

Вы уже знаете, что strip_string является допустимым ключом, почему бы не использовать его для непосредственного получения нужного значения?

import re

def abbrev(string):
    name = {'San Francisco': 'California', 'Boise': 'Idaho', 'Kansas City': 'Missouri', 'Miami': 'Florida'}

    #Remove the trailing digits from the string
    strip_string = re.sub(r'\d+', '', string)

    #If the key is present in the name, get the value
    if strip_string in name:
        initial =  name[strip_string]
    #Else get the first 3 characters of the input string
    else:
        initial = string[:3]

    return initial

string = ("Kansas City1")
initial = abbrev(string)
print(initial)

Вывод будет Missouri

Ваш оригинальный код не работал из-за следующего

Первая часть вашей строки print([value for value in name.values()]) дает вам ['California', 'Idaho', 'Missouri', 'Florida'], а вторая часть вашего утверждения [strip_string in name.keys()] дает вам [True]

print([value for value in name.values()])
#['California', 'Idaho', 'Missouri', 'Florida']
print([strip_string in name.keys()])
#[True]

Теперь [True] фактически равен 1, потому что int(True)=1, следовательно,
['California', 'Idaho', 'Missouri', 'Florida'][1] дает вам Idaho, потому что второй элемент списка - Idaho

2
Devesh Kumar Singh 1 Май 2019 в 18:32