假设我有一个像下面这样的列表(实际列表要长得多):
在这种情况下,列表['banana','pear'],['apple','pear']和['apple','pear','banana']中的所有项目都包含在列表['apple','pear','banana','watermelon']中(项目的顺序无关紧要),因此我想删除['banana','pear'],['apple','pear']和['apple','pear','banana'],因为它们是['apple','pear','banana','watermelon']的子集。
我的当前解决方案如下所示。我首先使用ifilter和imap创建一个生成器,以便为每个列表创建可能具有的超集。然后对于那些确实有超集的情况,我使用compress和imap将它们删除。
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和imap创建一个生成器,以便为每个列表创建可能具有的超集。然后对于那些确实有超集的情况,我使用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']]
我在想有没有更高效的方法来做这件事情?
[['pear', 'pineapple', 'pear'], ['pineapple', 'pear']]
这样的情况? - Kyle Pittmanfrom itertools
悬在那里,但那是我改变的唯一的东西。编辑:好吧,在编辑之前确实有这个问题。;) - Kyle Pittman