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']
.
我目前的解决方案如下所示.我首先使用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']]
Run Code Online (Sandbox Code Playgroud)
filter(lambda f: not any(set(f) < set(g) for g in fruits), fruits)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2038 次 |
最近记录: |