Python 减少字符串上的冗余条件列表

Python 减少字符串上的冗余条件列表,python,Python,我有一个条件列表,如下所示: conditions = [{"equals": "football"}, {"equals": "badminton"}, {"contains": "basketball"}, {"contains": "ball"}] conditions = [{"equals": "badminton"}, {"contains": "ball"}] 有些条件是多余的: 任何包含“basketball”的字符串也包含“ball” 任何等于“football”的字符串

我有一个条件列表,如下所示:

conditions = [{"equals": "football"}, {"equals": "badminton"}, {"contains": "basketball"}, {"contains": "ball"}]
conditions = [{"equals": "badminton"}, {"contains": "ball"}]
有些条件是多余的:

  • 任何包含“basketball”的字符串也包含“ball”
  • 任何等于“football”的字符串也包含“ball”
因此,条件的简化列表如下所示:

conditions = [{"equals": "football"}, {"equals": "badminton"}, {"contains": "basketball"}, {"contains": "ball"}]
conditions = [{"equals": "badminton"}, {"contains": "ball"}]
目前,我做了如下工作:

TO_REDUCE={(“contains”,“eq”):0,(“eq”,“contains”):1,(“contains”,“contains”):1}值是要保留的条件的索引
这是真的吗
在减少的同时:
是否减少=错误
对于范围内的i(len(条件)-1):
条件_1=条件[i]
对于范围(i+1,len(条件))内的j:
条件_2=条件[j]
操作符=获取操作符(条件1,条件2)#获取例如(“eq”,“contains”)
如果操作员要减少:
保留条件索引=减少[运算符]
保留条件=(条件1,条件2)[保留条件索引]
del条件[j]
删除条件[i]
条件=[保留条件]+条件
这是真的吗
打破
如果减少了(u):
打破
我使用dict来减少,因为可能还有其他操作符“start by”或“ends by”


有没有更有效的方法来获得简化的条件列表?

在我看来,这样做可能会容易得多。我认为,通过采用应包含的词语,并删除包含其中任何一项的条件,您将实现您想要的:

contains_words = [condition["contains"] for condition in conditions if "contains" in condition] # ["basketball", "ball"]

reduces_conditions = [condition for condition in conditions if not any([contains in condition.values()[0] and {"contains": contains} != condition for contains in contains_words])]

在我看来,这件事可以做得容易得多。我认为,通过采用应包含的词语,并删除包含其中任何一项的条件,您将实现您想要的:

contains_words = [condition["contains"] for condition in conditions if "contains" in condition] # ["basketball", "ball"]

reduces_conditions = [condition for condition in conditions if not any([contains in condition.values()[0] and {"contains": contains} != condition for contains in contains_words])]

根据您使用该列表的目的,在以后只过滤掉重复项可能会更容易,而不是像这样减少。@Green我使用该列表来构建代价高昂的SQL查询。条件越多,查询的解释性就越强。因此,我真的需要在之前减少列表。根据您使用此列表的目的,以后可能更容易筛选出重复项,而不是像这样减少。@Green我使用此列表构建SQL查询,这非常昂贵。条件越多,查询的解释性就越强。因此,我确实需要减少之前的列表。在给出的示例中,结果是
[{“equals”:“baddington”}]
,而它应该是
[{“equals”:“baddington”},{“contains”:“ball”}]
。我忘记了条件可以包含自身。我编辑了我的答案以使其生效。它也不起作用:条件
[{“谓词”:“eq”,“value”:“basketball”,},{“谓词”:“contains”,“value”:“basketball”,}]
在还原后保持不变,而
{“谓词”:“eq”,“value”:“basketball”,}
不应保留。@Rebecca您应该用更多的示例输入及其预期输出更新您的问题,这样人们可以在发布前进行测试,以避免这种编辑评论。根据给出的示例,结果是
[{“equals”:“baddington”}]
而它应该是
[{“equals”:“baddington”},{“contains”:“ball”}]
。我忘了条件可以包含自身。我编辑了我的答案以使其生效。它也不起作用:条件
[{“谓词”:“eq”,“value”:“basketball”,},{“谓词”:“contains”,“value”:“basketball”,}]
在还原后保持不变,而
{“谓词”:“eq”,“value”:“basketball”,}
不应保留。@Rebecca您应该用更多的示例输入及其预期输出更新您的问题,这样人们可以在发布前进行测试,以避免这种编辑评论乒乓球