首页 > 解决方案 > 使用列表列表过滤列表列表

问题描述

我有两个列表列表,一个包含所有记录,例如[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']]一个包含规则[['milk', 'eggs'], ['milk','ham']]

[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]我正在尝试通过 list_of_rules 过滤记录,但是,尽管它不完全匹配[['milk', 'eggs'], ['milk','ham']]订单和额外的项目,我还是想捕获它。

records = [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']]

list_of_rules = [['milk', 'eggs'], ['milk','ham']]

# this list comprehension only filters for exact matches

results = [[x for x in L if x in records] for L in list_of_rules] 


# expected output

print(results)
>>[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]

非常感谢任何和所有建议。

标签: pythonpython-3.xlistlist-comprehension

解决方案


您可以使用此列表理解:

records = [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']]

list_of_rules = [['milk', 'eggs'], ['milk','ham']]

results = [L for L in records if any(set(R).issubset(L) for R in list_of_rules)]

print(results) # => [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]

它对每个记录列表进行循环,L并检查是否存在至少一个规则列表R(使用内置函数any),以便R包含在L(使用 set 方法issubset)中。


推荐阅读