Условия на комбинации itertools Python - PullRequest
0 голосов
/ 25 марта 2020

Я бы хотел заранее определить условие для комбинаций itertools.

Моя проблема: мне нужны только комбинации с разницей в 100 дней или менее.

На самом деле мой код ломает l oop. Я хотел бы сократить и продолжить со следующими комбинациями. Возможно ли это?

from itertools import combinations
for row in combinations(df.values, 5):
    E1_date, E2_date, E3_date, E4_date, E5_date = row[0][0], row[1][0], row[2][0], row[3][0], row[4][0]
    if E5_date - E1_date > 100:
        break
        # The combinations must not have more than 100 days of difference

1 Ответ

0 голосов
/ 25 марта 2020

Вместо фильтрации в вашем l oop, передайте итератор комбинации на filter(). Использовать ваши данные немного сложно, поскольку вы не предоставили пример того, что у вас есть, но вот минимальный пример, который, надеюсь, даст вам достаточно идеи.

С filter() вы просто даете ему лямбда-функцию, которая возвращает True для нужных комбинаций и False для тех, которые вам не нужны:

from itertools import combinations

values = list(range(10))

# all 5 element combinations of 0-9 such that the difference
# between the first and last is less than 6 
combos = filter(lambda e: e[4] - e[0] < 6, combinations(values, 5))

for row in combos:
    print(row, row[4] - row[0])

Печать:

(0, 1, 2, 3, 4) 4
(0, 1, 2, 3, 5) 5
(0, 1, 2, 4, 5) 5
(0, 1, 3, 4, 5) 5
(0, 2, 3, 4, 5) 5
(1, 2, 3, 4, 5) 4
(1, 2, 3, 4, 6) 5
(1, 2, 3, 5, 6) 5
...
(4, 5, 7, 8, 9) 5
(4, 6, 7, 8, 9) 5
(5, 6, 7, 8, 9) 4
...