我有一份名单items_to_delete = [(69, 70), (84, 88)]
我想从字典列表中删除所有start
和end
值等于items_to_delete
列表中元组的项。
input_list =
[{'name': 'John', 'gender': 'male', 'start': 69, 'end': 70},
{'name': 'Sara', 'gender': 'female', 'start': 75, 'end': 80},
{'name': 'George', 'gender': 'male', 'start': 84, 'end': 88},
{'name': 'James', 'gender': 'male', 'start': 98, 'end': 101}]
预期输出为:
[{'name': 'Sara', 'gender': 'female', 'start': 75, 'end': 80},
{'name': 'James', 'gender': 'male', 'start': 98, 'end': 101}]
到目前为止我所做的:
res = [dict_ent for dict_ent in input_list for item in items_to_delete if not (dict_ent['start']==item[0] and dict_ent['end']==item[1])]
但是它有我不想要的字典x1和我想要的字典x2。
如何使用列表解析实现预期的结果?谢谢!
4条答案
按热度按时间vsikbqxv1#
你可以使用内置的
operator.itemgetter
来解决这个问题:您可以使用
itertools.filterfalse
执行类似的操作wnrlj8wa2#
定义一个helper函数,它将决定是否应该保留项。
旁注:
btqmn9zl3#
错误的发生是由于内部循环。例如,当dict_ent=第一个字典元素和item=(69,70),则条件为假,并且不存储在res中。然而,在内部循环的下一次迭代中,当item的值变为(84,88),则条件满足,并且将dict存储在res中。类似地,由于内部循环的原因,第二个字典元素两次满足这个条件,所以它被存储了两次。2你可以通过扩展for循环来使用break语句来解决这个问题。
如果你想使用列表解析来实现这一点,你可以这样做:
eyh26e7m4#
避免显式内部循环
让Python
in
操作符为您完成这项工作,因为它比编写内部循环更不容易出错。结果: