在 Python 中,我使用列表理解来过滤带有键的字典列表。我正在处理 None 但仍然收到错误“NoneType 对象不可迭代”。我知道这一定是一件简单的事情,但我看不到。为什么仍然出错?
这是我重现问题的代码:
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)
错误的原因在于,虽然你处理了
item
为
None
的情况,但你没有处理
item['values']
为
None
的情况。 当代码遇到
{'values': None}
时,内部的列表推导式
[v for v in val if v > 10]
会尝试迭代
val
,而
val
此时是
None
,从而导致 "TypeError: 'NoneType' object is not iterable" 错误。
为了解决这个问题,你可以在内部列表推导式中也加入对
val
的判断:
def process_data(data, key):
return [
{k: [v for v in val if v is not None and 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)
这样,如果
val
为
None
,内部列表推导式就不会尝试对其进行迭代,从而避免了错误。