перестановки с уникальными значениями

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 слишком велик.

Извините, мне следовало описать актуальная проблема.

68
задан xyz-123 8 June 2011 в 20:35
поделиться

1 ответ

Для генерации уникальных перестановок ["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()
0
ответ дан 24 November 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: