Заменить определенное значение определенного ключа в списке словарей python

У меня есть список словарей

list1 = [{'time': '2020', 'name': 'one', 'address': '15423'},{'time': '2021', 'name': 'two', 'address': '8548305'}, {'time': '2019', 'name': 'five', 'address': '15423'}]

Я хочу преобразовать все, что имеет адрес с 15423, в «Действительный», а все остальные случаи недействительны. Окончательный результат

list1 = [{'time': '2020', 'name': 'one', 'address': 'Valid'},{'time': '2021', 'name': 'two', 'address': 'Invalid'}, {'time': '2019', 'name': 'five', 'address': 'Valid'}]

Вот что я пробовал

if '15423' in list1['address']:
    list1['address'] = 'Valid'
else:
    list1['address'] = 'Invalid'

Но я не уверен, почему это не работает. Может быть, мне нужно перебрать весь столбец. Ценю твою помощь

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
45
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно перебрать элементы list1, используя цикл for, поскольку list1 — это список словарей:

for i in range(len(list1)):
    if '15423' in list1[i]['address']:
        list1[i]['address'] = 'Valid'
    else:
        list1[i]['address'] = 'Invalid'
        
print(list1)

Вы также можете сжать if/else в тройку, если ищете более краткое решение:

for i in range(len(list1)):
    list1[i]['address'] = 'Valid' if '15423' in list1[i]['address'] else 'Invalid'

Оба они печатают:

[{'time': '2020', 'name': 'one', 'address': 'Valid'},
{'time': '2021', 'name': 'two', 'address': 'Invalid'},
{'time': '2019', 'name': 'five', 'address': 'Valid'}]

Я не знаю почему, но все значения имеют значение Invalid, поэтому по некоторым причинам он не учитывает допустимый случай.

YanRemes 21.03.2022 02:29

@YanRemes Отредактировано, попробуйте сейчас.

BrokenBenchmark 21.03.2022 02:30

Это все еще недействительно для всех из них

YanRemes 21.03.2022 02:36

Я не могу воспроизвести проблему. Пожалуйста, подтвердите правильность данных примера, которые вы предоставили.

BrokenBenchmark 21.03.2022 02:37

Да, это мои данные, но похоже, что они не проходят через оператор if и учитывают только оператор else

YanRemes 21.03.2022 02:56

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

BrokenBenchmark 21.03.2022 03:00

@BrokenBenchmark Обратитесь к моему решению, если оно вам подходит.

Vaibhav 21.03.2022 23:08

вам нужно пройтись по списку!


Почему?

скажем num_list = [0, 1, 2, 3]

используя цикл for следующим образом:

for item in num_list:
    ...

будет проходить через num_list, как и следовало ожидать. item будет установлено текущее значение, в этом случае он установит item на 1, выполнит код в цикле, затем установит item в 2, затем снова выполнит код в цикле и так далее.

теперь скажем num_list = [{"number": 0}, {"number": 1}, {"number": 2}, {"number": 3}].

на этот раз, если вы запустите тот же цикл for, item все равно будет установлено текущее значение, в этом случае оно будет установлено на Словарь вместо числа. таким образом, item устанавливается в {"number": 0}, затем запускается код внутри цикла, затем item устанавливается в {"number": 1}, затем код внутри цикла запускается снова и т. д.

таким образом, item будет установлен в словарь, который к тому времени вы сможете редактировать, как и любой другой словарь! просто сделай item["number"] = ...


для фактического фиксированного кода, вот и я

list1 = [
    {'time': '2020', 'name': 'one', 'address': '15423'},
    {'time': '2021', 'name': 'two', 'address': '8548305'},
    {'time': '2019', 'name': 'five', 'address': '15423'}
]


for item in list1:
    if item["address"] == "15423":
        item["address"] = "Valid"
    else:
        item["address"] = "Invalid"

print(list1)

выход:

[
    {'time': '2020', 'name': 'one', 'address': 'Valid'},
    {'time': '2021', 'name': 'two', 'address': 'Invalid'},
    {'time': '2019', 'name': 'five', 'address': 'Valid'}
]

Большинство из них ответили на вопрос. См. приведенное ниже решение, а также несколько пунктов:

У вас есть словари в списке, поэтому вам нужно сначала перебрать каждый элемент и получить доступ к словарю. Во время итерации проверьте, присутствует ли ключ адреса в словаре или нет, а затем примените условие if. Если мы используем item['address'], возможно, что код может сломаться, если мы не найдем ключ адреса ни в одном из словарей. Следовательно, используйте item.get('address') для извлечения значения.

Вот код:

list1 = [
{'time': '2020', 'name': 'one', 'address': '15423'},
{'time': '2021', 'name': 'two', 'address': '8548305'},
{'time': '2019', 'name': 'five', 'address': '15423'}
]


for item in list1:
    if item.get('address'):
         if item.get('address')== "15423":
             item["address"] = "Valid"
         else:
             item["address"] = "Invalid"
print(list1)

Другие вопросы по теме