У меня есть огромный список из более чем 200 000 списков внутри. Например:
huge_list = [
[23, 18, 19, 36, 42],
[22, 18, 19, 36, 39],
[21, 18, 19, 37, 42]
]
Имеет следующие свойства:
- каждое число в каждом списке уникально;
- каждый список имеет отсортированные номера; // в данном случае это не так, ПРОСТО для примера.
- каждое число из каждого списка является случайным значением от 1 до 80;
- каждый список имеет предопределенный размер 20 элементов. Не меньше, не больше.
- числа не всегда находятся в одной и той же позиции в списке. это может быть [1,2,3] или [1, 3, 5], но имеют общие 1, 3 и (1,3).
Я хочу, чтобы результат был сколько раз каждую комбинацию можно найти во всех списках:
18:3(times),
19:3(times),
36:2(times),
(18,42):2(times),
(19,42):2(times),
(18, 36):2(times),
(19, 36):2(times),
(18,19):2(times),
(18,19,36):2(times),
(18, 19, 42):2(times) etc.
Самый медленный и невозможный способ - сгенерировать все комбинации по 1, взятой из 80, затем по 2, взятой из 80, затем по 3, взятой из 80 и т. д. до комбинации на 20, взятой на 80, что является почти бесконечным числом. Это невозможно сделать, но также невозможно из-за того, что число списков в огромный_листике превышает 200 000.
Мне нужно что-то вроде счетчика, но быстрее. Как можно быстрее, пожалуйста, потому что это станет намного медленнее, начиная с комбо из 12, взятых 80 или даже меньше.
Это то, что я пытался сделать до сих пор:
mydict = {}
while len(huge_list) > 1:
to_check = huge_list[0]
del huge_list[0]
for draw in huge_list:
for num in to_check:
# one:
if num in draw:
if num in mydict:
mydict[num] += 1
else:
mydict[num] = 1
if 1 in mydict.values():
for key in mydict.keys():
if mydict[key] == 1:
mydict[key] += 1
print mydict
Результат :
{18: 3, 19: 3, 36: 2, 42: 2}
Но почти работает только для комбинаций 1, взятых из 80. Как это сделать для других комбинаций? И как сделать это быстрее, чем этот путь?
PS Мне нужна только общая комбинация, меня не интересуют комбинации с 1 или 0 совпадением во всех списках. Так что, может быть, это поможет вам в скорости, чтобы быть еще быстрее.