在给定条件的情况下生成列表的所有组合

时间:2017-11-30 16:44:28

标签: python combinations combinatorics itertools

我想为k个变量列表生成长度为n的所有组合。我可以这样做:

import itertools
import pandas as pd
from sklearn import datasets

dataset = datasets.load_breast_cancer()
X = dataset.data
y = dataset.target
df = pd.DataFrame(X, columns=dataset.feature_names)
features = dataset.feature_names

x = set(['mean radius', 'mean texture'])

for s in itertools.combinations(features, 3):
    if x.issubset(set(s)):
        print s

len(features)= 30,因此这将生成4060个组合,其中n = 3。当n = 10时,这是30,045,015种组合。

len(tuple(itertools.combinations(features, 10)

然后将根据条件语句评估这些组合中的每一个。然而,对于n> 10,这变得不可行。

不是生成所有组合,而是按照本例中的某些条件进行过滤,是否可以在给定此条件的情况下生成所有组合?

换句话说,生成所有组合,其中n = 3,4,5 ... k,给定'平均半径'和'意味着纹理'出现在组合中?

1 个答案:

答案 0 :(得分:3)

只需生成没有'mean radius''mean texture'的组合,并将这两个组合添加到每个组合中,从而大大减少了组合的数量。这样您就不必进行过滤,生成的每个组合都很有用。

# remove the fixed features from the pool:
features = set(features) - x 
for s in itertools.combinations(features, n - len(x)):
    s = set(s) & x # add the fixed features to each combination
    print(s)