itertools与分块集选择

2024-04-26 12:01:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,我们可以把它想象成3个罐子和3个球。你知道吗

mylist= [
            ['HIGH_1', 'MED_1', 'LOW_1'],
            ['HIGH_2', 'MED_2', 'LOW_2'],
            ['HIGH_3', 'MED_3', 'LOW_3']
        ]

我只能从每个瓮中选择一个球。 我想得到1个球,2个球和3个球的所有组合。在一个列表中回答。你知道吗

为了实现这一点,我在每个urn

mylist= [
            [None, 'HIGH_1', 'MED_1', 'LOW_1'],
            [None, 'HIGH_2', 'MED_2', 'LOW_2'],
            [None, 'HIGH_3', 'MED_3', 'LOW_3']
           ]

下面使用itertools和filter可以得到所需的解决方案。你知道吗

combos = []
for l in itertools.product(*mylist):
    combos.append(filter(lambda a: a is not None, l))

combos.remove(())   # remove the empty element
print [list(elem) for elem in combos]


[['HIGH_3'], ['MED_3'], ['LOW_3'], ... , ['MED_2', 'HIGH_3'], ['MED_2', 'MED_3'], ['MED_1', 'HIGH_3'], ..., ['LOW_1', 'LOW_2', 'MED_3'], ['LOW_1', 'LOW_2', 'LOW_3']]

产生63种元素。你知道吗

9(单元素)+27(两元素)+27(三元素)=63

加上假和后过滤并不是最好的方法。你知道吗

有没有办法避免这两个看似多余的步骤?你知道吗


Tags: innone元素列表formedfilterremove
2条回答

你可以用下面的发电机

def combos(data):
    for i in xrange(1, len(data) + 1):
        for item in itertools.combinations(data, i):
            for j in itertools.product(*item):
                yield j

可能是我能想到的最能解馋的方法了。你知道吗

仅附加非空项时,不需要remove()。您也可以跳过最后一个列表理解,将项目转换为筛选后的列表。你知道吗

import itertools
import pprint

mylist= [
            [None, 'HIGH_1', 'MED_1', 'LOW_1'],
            [None, 'HIGH_2', 'MED_2', 'LOW_2'],
            [None, 'HIGH_3', 'MED_3', 'LOW_3']
           ]
combos = []
for item in itertools.product(*mylist):
    combo = list(filter(lambda a: a is not None, item))
    if combo:
        combos.append(combo)

pprint.pprint(combos)

更新

手动插入None并不好。在列表中添加一行:

import itertools
import pprint

mylist= [
            ['HIGH_1', 'MED_1', 'LOW_1'],
            ['HIGH_2', 'MED_2', 'LOW_2'],
            ['HIGH_3', 'MED_3', 'LOW_3']
           ]

mylist_with_nones = [[None] + item for item in mylist]
combos = []
for item in itertools.product(*mylist_with_nones):
    combo = list(filter(lambda a: a is not None, item))
    if combo:
        combos.append(combo)

pprint.pprint(combos)

相关问题 更多 >