Заменить элемент в словаре списков

#python #python-3.x #list #dictionary #replace

Вопрос:

У меня есть словарь, подобный следующему:

 info = {
    # Many more entries similar to this one
    'library1' : {'files' : ['path1', 'path2', 'path3_replace', 'path4']}
}
 

Моя цель состоит в том, чтобы найти и path3_replace заменить другой путь. Вот что я попробовал:

 new_path = "was_replaced"


for lib in info:
    m = info[lib]
    for path in m['files']:
        if "replace" in path:
            path = new_path
            print(path)


# Here I'm just trying to print all paths to show if it worked or not

for lib in info:
    m = info[lib]
    for path in m['files']:
        print(path)
 

Вывод консоли отображается следующим образом:

 was_replaced
path1
path2
path3_replace
path4
 

Очевидно, что строка в словаре не заменяется и остается path3_replace неизменной . Желаемый результат -:

 was_replaced
path1
path2
was_replaced
path4
 

Как я могу этого достичь? Спасибо вам за любую помощь!

Изменить: Я намеренно оставил пример кода очень расплывчатым, чтобы изолировать проблему

Комментарии:

1. Для тех, кто проголосовал против, могу ли я получить комментарий или причину? Я хотел бы помочь, чем могу!

Ответ №1:

Строка в диктанте не заменяется, потому что вы ее никогда не меняли. Вы изменили индекс цикла, а не его источник данных. Чтобы изменить элемент списка, вам необходимо получить доступ к списку.

 for idx, path in enumerate(m['files']):
    if "replace" in path:
        m['files'][idx] = new_path
        print(m['files'][idx])
 

path это просто локальная переменная.

Комментарии:

1. Потрясающе, что сработало! Я новичок в python и не знал, что path это всего лишь локальная переменная, я принял ваш ответ, но не могу его озвучить. Большое спасибо!

2. Рад, что это помогло. Да, требуется несколько недель, чтобы привыкнуть к тому, как работают переменные. path это новый скаляр, который вы создали, который начинает свою жизнь как копия значения из вашего списка.