我有两个列表,一个包括所有记录,例如[['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']]顺序和额外的项目明智。
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']]任何和所有的建议都非常感谢。
发布于 2019-04-03 21:01:13
您可以使用此列表理解:
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)。
发布于 2019-04-03 21:01:32
您可以使用规则的list of sets,并要求任何带有内部列表的规则交叉点‘与set相同(即集合中的所有项也都存在于内部列表中):
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']]https://stackoverflow.com/questions/55504113
复制相似问题