itertools.permutations генерирует, где его элементы рассматриваются как уникальные на основе их положения, а не их значения. Поэтому в основном я хочу избежать дублируются вроде этого:
>>> list(itertools.permutations([1, 1, 1]))
[(1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1)]
Последующая фильтрация невозможна, потому что количество перестановок в моем случае слишком велико.
Кто-нибудь знает подходящий алгоритм для этого?
Большое спасибо!
РЕДАКТИРОВАТЬ:
В основном я хочу следующее:
x = itertools.product((0, 1, 'x'), repeat=X)
x = sorted(x, key=functools.partial(count_elements, elem='x'))
что невозможно, потому что sorted
создает список, а вывод itertools.product слишком велик.
Извините, мне следовало описать актуальная проблема.
Для генерации уникальных перестановок ["A","B","C","D"]
, я использую следующее:
from itertools import combinations,chain
l = ["A","B","C","D"]
combs = (combinations(l, r) for r in range(1, len(l) + 1))
list_combinations = list(chain.from_iterable(combs))
, Который генерирует:
[('A',),
('B',),
('C',),
('D',),
('A', 'B'),
('A', 'C'),
('A', 'D'),
('B', 'C'),
('B', 'D'),
('C', 'D'),
('A', 'B', 'C'),
('A', 'B', 'D'),
('A', 'C', 'D'),
('B', 'C', 'D'),
('A', 'B', 'C', 'D')]
Уведомление, дубликаты не создаются (например, объекты в сочетании с D
не сгенерированы, поскольку они уже существуют).
Пример: Это может затем использоваться в генерации условий высшего порядка или низшего порядка для моделей OLS через данные в кадре данных Панд.
import statsmodels.formula.api as smf
import pandas as pd
# create some data
pd_dataframe = pd.Dataframe(somedata)
response_column = "Y"
# generate combinations of column/variable names
l = [col for col in pd_dataframe.columns if col!=response_column]
combs = (combinations(l, r) for r in range(1, len(l) + 1))
list_combinations = list(chain.from_iterable(combs))
# generate OLS input string
formula_base = '{} ~ '.format(response_column)
list_for_ols = [":".join(list(item)) for item in list_combinations]
string_for_ols = formula_base + ' + '.join(list_for_ols)
Создает...
Y ~ A + B + C + D + A:B + A:C + A:D + B:C + B:D + C:D + A:B:C + A:B:D + A:C:D + B:C:D + A:B:C:D'
, Который может затем быть передан по каналу к Вашему регрессия OLS
model = smf.ols(string_for_ols, pd_dataframe).fit()
model.summary()