Почему я получаю сообщение «Объект NoneType не повторяется» при фильтрации списка словарей с пониманием списка и обработкой None?

Я пытаюсь отфильтровать список словарей в Python, используя понимание списка. Я обрабатываю значения None, но продолжаю получать сообщение об ошибке «Объект NoneType не повторяется». Я ожидал, что мой код пропустит значения None, но он все равно выдает ошибку. Как я могу это исправить?

Вот мой код для воспроизведения проблемы:

def process_data(data, key):
    return [
        {k: [v for v in val if v > 10] for k, val in item.items() if k == key}
        for item in data
        if item is not None
    ]

data = [
    {'values': [5, 15, 25]},
    None,
    {'values': [8, 12, 20]},
    {'values': None},
    {'values': [7, 14, 21]}
]

filtered_data = process_data(data, 'values')
print(filtered_data)

Вы не справляетесь с None в {'values': None}

deceze 20.07.2024 10:24

Чтобы расширить то, что сказал Децезе: у вас есть вложенный цикл for. Внутренний цикл - это тот, который вызывает b/c. None не является итеративным. Если вы попытаетесь переписать понимания в виде полных циклов и заполнить значения вручную, вы сразу увидите проблему.

Dov Rine 20.07.2024 12:01

Если у вас есть контроль над тем, как создается data, вы можете рассмотреть возможность использования {'values': []} вместо {'values': None}. None удобно, когда действительно нужно отличить отсутствие контейнера от пустого контейнера, но я не думаю, что это обычная необходимость.

chepner 20.07.2024 16:40
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
3
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как говорится в комментариях, вы не обрабатываете None в 4-м словаре. Не существует исключений для получения значения None в словаре, только если вместо словаря имеется значение None. Однако это простое решение. Добавьте еще одно условие в конце строки 3, чтобы убедиться, что val не является None. Вот написан новый код.

def process_data(data, key):
    return [
        {k: [v for v in val if v > 10] for k, val in item.items() if k == key and val is not None}
        for item in data
        if item is not None
    ]
.
.
.

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