Alex_Piggy
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Доброе время, Mavrikii, DJMC Цитата: что когда строк мало, они делаются за секунду, но когда их 1000 | Тысячи строк - это имеется в виду исходных, верно? Если не нужно количество дубликатов ('XX21122X1X11211' - 4 шт), а только их наличие - то лучше будет зайти с другой стороны. И уменьшить количество наборов, из которых будет строить дубликаты. Но вменяемо это оформить - мозгов не хватает... 1. Переводим в массив массивов. 2. Берем первый массив. По очереди проходим по его элементам и проверяем - в следующих после него массивах проверяем есть ли такие элементы. Оставляем только те элементы, которые есть. Если элементов нет - этот массив из последующих проверок исключаем. 3. Результатом будет массив массивов из которых строятся дубликаты для первого массива (первой строки). Строим строки и заносим в набор (set). 4. Повторяем для последующих строк по принципу j=i+1 5. Выводим полученный set. Код: import itertools as it import re strs = [ '1-(1,X);2-(1,X);3-(2);4-(1,X);5-(X,1);6-(2);7-(2);8-(X,2);9-(1,2);10-(1,X);11-(1);12-(1);13-(1,2);14-(1);15-(1)', '1-(1,X);2-(1);3-(2);4-(1);5-(1);6-(2);7-(2);8-(2);9-(1);10-(1);11-(1);12-(1);13-(1);14-(1);15-(1) ', '1-(X,2);2-(X,2);3-(2);4-(1);5-(1,X);6-(1,2);7-(X,2);8-(X,2);9-(1,2);10-(X,2);11-(1,X);12-(1,2);13-(2);14-(1);15-(1)', ] mainArr = [] outSet = set() for str in strs: m = re.findall(r'\((.*?)\)', str) mainArr.append([v.split(',') for v in m]) for a,b in enumerate(mainArr[:-1]): tmpArr = mainArr[a+1:].copy() for i in range(0,len(b)): for c in tmpArr: for d in c[i]: if not d in b[i]: c[i].remove(d) if not c[i]: tmpArr.remove(c) for e in tmpArr: outSet.update([''.join(x) for x in it.product(*e)]) print (outSet) | UPD: Так и количество дубликатов посчитать можно - просто записывать в list, а не set, и затем считать в dict. UPD2: 1. Сравниваем первую строку со второй и третьей - получаем '1-(1,X);2-(1);3-(2);4-(1);5-(1);6-(2);7-(2);8-(2);9-(1);10-(1);11-(1);12-(1);13-(1);14-(1);15-(1) ', '1-(X);2-(X);3-(2);4-(1);5-(1,X);6-(2);7-(2);8-(X,2);9-(1,2);10-(X);11-(1);12-(1);13-(2);14-(1);15-(1)' Эти варианты добавляем в set (10 шт). 2. Сравниваем вторую строку с третьей - не получаем ничего Результат - набор из 10 строк. |