首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用列表列表筛选列表列表

使用列表列表筛选列表列表
EN

Stack Overflow用户
提问于 2019-04-03 20:55:39
回答 2查看 122关注 0票数 2

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

我试图通过list_of_rules过滤记录,然而,我想捕获[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']],尽管它不完全匹配[['milk', 'eggs'], ['milk','ham']]顺序和额外的项目明智。

代码语言:javascript
复制
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']]

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-03 21:01:13

您可以使用此列表理解:

代码语言:javascript
复制
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)。

票数 1
EN

Stack Overflow用户

发布于 2019-04-03 21:01:32

您可以使用规则的list of sets,并要求任何带有内部列表的规则交叉点‘与set相同(即集合中的所有项也都存在于内部列表中):

代码语言:javascript
复制
records = [['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk'], ['cereal', 'skittles']]

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

# this list comprehension only filters for exact matches

# take the full inner list if all things in any rule are in this inner list
results = [ x for x in records if any( p.intersection(x) == p for p in list_of_rules)  
print(results)

输出:

代码语言:javascript
复制
[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55504113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档