Генерация всех возможных распределений в списке?

Добрый день! Я новичок в Python (да и в программировании в принципе) и у меня возникла сложность с созданием функции генерации списков. Я сейчас пытаюсь сделать себе что-то на подобии автопрогнозов для портфельных инвестиций и мне нужно создать списки со всеми возможными вариантами распределения долей между акциями (исключая варианты когда доли распределены между меньшим количеством акций), причем количество акций может быть разным.

Как пример приведу вариант с 3-мя акциями и шагом долей в 0.25:
1: |0.00|0.00|1.00|0.00|0.25|0.25|0.25|0.25|0.50|0.00|0.50|0.50|0.00|0.75|0.75|
2: |0.00|1.00|0.00|0.25|0.00|0.75|0.25|0.50|0.25|0.50|0.00|0.50|0.75|0.00|0.25|
3: |1.00|0.00|0.00|0.75|0.75|0.00|0.50|0.25|0.25|0.50|0.50|0.00|0.25|0.25|0.00|



Я никак не могу придумать как генерировать подобные списки для различного колическва акций например для 4-ех:

[[0.97, 0.01, 0.01,0.01],[0.96,0.02,0.01,0.01]...[0.01,0.01,0.01,0.97]]


Был бы очень благодарен за помощь!

UPD: Спасибо Domini снова за напоминание что читать документацию полезнее, чем задавать тупые вопросы, я смог решить свою проблему довольно легко просто внимательно почитав, но у меня остался вопрос, можно ли увеличить производительность, потому что компьютер просто виснет на генерации.

вот код:

from itertools import *

li = []

for i in count(0.00, 0.05):
    li.append(i)
    if i > 1.0:
        break

arr = []
for x in product(li, repeat=3):
    if sum(x) == 1.0:
        arr.append(x)
    else:
        pass

print arr
  • Вопрос задан
  • 3248 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Domini
Если я правильно понял вопрос, вам достаточно внимательно прочитать страничку мануала.
Ответ написан
@Domini
В лоб полный ленивый перебор с фильтрацией itertools.ifilter(lambda x: sum(x) == 100, itertools.product(xrange(0, 101), repeat=3)) (для вывода для теста обернуть в list(...)).
Ответ написан
Комментировать
@Ventura
Рекурсия спасет отца русской демократии.
Общее решение здесь — stackoverflow.com/questions/13131491/partition-n-items-into-k-bins-in-python-lazily

Частное:
print [[sum(parts) for parts in subset] for subset in partition(list(itertools.repeat(1, 100)), 3)]

Hint: На float точность будете терять.
Hint 2: Для разбиение на большое количество «долей» лучше переписать на генераторы или уменьшить шаг, а то вариантов много.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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