假设我有一个如下列表(实际列表要长得多):
fruits = [['apple', 'pear'],
['apple', 'pear', 'banana'],
['banana', 'pear'],
['pear', 'pineapple'],
['apple', 'pear', 'banana', 'watermelon']]
在这种情况下,列表中的所有项目['banana', 'pear']
,['apple', 'pear']
和['apple', 'pear', 'banana']
都包含在列表中['apple', 'pear', 'banana', 'watermelon']
(项目的顺序无关紧要),所以我想删除['banana', 'pear']
, ['apple', 'pear']
, 和['apple', 'pear', 'banana']
因为它们是 的子集['apple', 'pear', 'banana', 'watermelon']
。
我目前的解决方案如下所示。我首先使用ifilter
andimap
为每个列表可能具有的超集创建一个生成器。然后对于那些确实有超集的情况,我使用compress
并imap
删除它们。
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']]