Выполнение расчетов комбинаций такого рода не быстро.Я рассчитываю это, используя time.time.
starttime = time.time()
Мы будем использовать комбинации из itertools.
from itertools import combinations
Сначала я воссоздаю ваши данные (пожалуйста, укажите в следующий раз для респондентов, чтобы мыне надо воссоздавать).Я использую буквы для имен.Я буду использовать pd.Series, так как это соответствует вашим данным, и это будет быстрее всего после непосредственного использования numpy.
s = pd.Series(np.random.randint(8,11,22), index = list('ABCDEFGHIJKLMNOPQRSTUV'))
Далее установите параметры комбинации.
# set combination parameters
r = 11
n = len(s)
Создайте список для отслеживания имен, баллы которых == 100.
name_list = []
Наконец, выполните цикл по комбинациям, сохраняя все комбинации, суммирующие до 100.
for p in combinations(s.index, r):
if s.loc[list(p)].sum() == 100:
name_list.append(p)
endtime = time.time()
print('Time to run', endtime - starttime)
Time to run 350.4899344444275
name_list (fist ten rows)
[('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'M'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'T'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'V'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'M', 'T'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'M', 'V'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'T', 'V'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'M'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'T'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'V'),
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'M', 'O'),...
Сколько существует комбинаций?
print(len(name_list))
86724