【发布时间】:2020-11-17 19:34:27
【问题描述】:
我有一个字典列表,我正在尝试为其编写过滤器函数。要过滤的参数将以字典形式给出,其中键是字符串(匹配要过滤的字典列表中的键),值是具有上限和下限的列表。
要过滤的字典列表示例:
test_list = [{'hello':1, 'goodbye':4}, {'hello':7, 'goodbye':6}, {'hello': 4, 'goodbye': 2}]
过滤参数示例:
params = {'hello':[1, 6], 'goodbye':[5, 8]}
我写的函数如下:
def filter_list(target_list, **kwargs):
filtered_list = target_list
for k,v in kwargs.items():
for target in filtered_list:
if target[k]<v[0] or target[k]>v[1]:
filtered_list.remove(target)
return filtered_list
由于某种原因,第二个参数没有被检查,我得到的输出是:
filter_it = filter_list(test_list, **params)
print(filter_it)
>>[{'hello': 4, 'goodbye': 2}]
这是为什么?我认为字典列表中的任何项目都不应该通过标准。但是如果我将参数更改为:
params = {'hello':[1, 8], 'goodbye':[5, 8]}
现在的输出是:
>>[{'hello': 7, 'goodbye': 6}]
要使用的真实数据是一个包含大约 2500 个字典的列表,每个字典有大约 45-50 个键:值对。我需要能够按任意数量的参数进行过滤,因为我并不总是想为每个参数指定上限和下限,因此我不硬编码每个参数的比较。
提前感谢所有/任何帮助!
【问题讨论】:
-
你的参数是一样的。但是你给出不同的结果。
-
@XuQiushi 是的,抱歉-我刚刚编辑了它!
-
您正在删除列表项,同时迭代它们..
-
@adirabargil 是的。这个想法是如果项目不满足被评估的条件,则在每次迭代时从列表中删除项目。然后它们不应该在下一次迭代中出现。
标签: python python-3.x list dictionary filter