Использование списка списков для фильтрации списка списков - PullRequest
2 голосов
/ 03 апреля 2019

У меня есть два списка списков, один из которых включает в себя все записи, например [['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']]

Любые и все рекомендации очень ценятся.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Вы можете использовать этот список понимания:

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 (с использованием метода набора issubset).

0 голосов
/ 04 апреля 2019

Вы можете использовать list из sets правил и требовать, чтобы любое правило пересечение 'с внутренним списком было идентично set (т.е. all предметы в наборе также присутствуют во внутреннем списке):

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']]
...