从Python中的列表中删除列表子集的最快方法

Ale*_*lex 3 python subset python-itertools superset python-2.7

假设我有一个列表列表,如下所示(实际列表更长):

fruits = [['apple', 'pear'],
          ['apple', 'pear', 'banana'],
          ['banana', 'pear'],
          ['pear', 'pineapple'],
          ['apple', 'pear', 'banana', 'watermelon']]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在列表中的所有项目['banana', 'pear'],['apple', 'pear']并且['apple', 'pear', 'banana']都包含在列表中['apple', 'pear', 'banana', 'watermelon'](项目的顺序并不重要),所以我想删除['banana', 'pear'],['apple', 'pear']以及['apple', 'pear', 'banana']因为它们的子集['apple', 'pear', 'banana', 'watermelon'].

我目前的解决方案如下所示.我首先使用ifilterimap为每个列表可能具有的超集创建生成器.然后对于那些有超集的情况,我使用compressimap放弃它们.

from itertools import imap, ifilter, compress

supersets = imap(lambda a: list(ifilter(lambda x: len(a) < len(x) and set(a).issubset(x), fruits)), fruits)


new_list = list(compress(fruits, imap(lambda x: 0 if x else 1, supersets)))
new_list
#[['pear', 'pineapple'], ['apple', 'pear', 'banana', 'watermelon']]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更有效的方法来做到这一点?

luk*_*nko 6

filter(lambda f: not any(set(f) < set(g) for g in fruits), fruits)
Run Code Online (Sandbox Code Playgroud)