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

2024-03-29 12:38:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我试图按规则列表筛选记录,但是,我想捕获[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']],尽管它不完全匹配[['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']]

非常感谢所有建议。你知道吗


Tags: ofin列表for规则记录spameggs
2条回答

您可以使用listsets规则,并要求带有内部列表的任何规则intersectionset相同(即,集合中的所有项也存在于内部列表中):

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)

输出:

[['eggs', 'milk', 'butter'], ['ham', 'spam', 'milk']]

您可以使用以下列表:

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(使用内置函数^{}),以便R包含在L(使用set方法^{})。你知道吗

相关问题 更多 >