Pure Python, в памяти, решение. (Если у вас есть баран)
Чтобы получить наборы имен, я переставляю xlist, затем формирую набор каждого транспонированного элемента, который удалит любое дублирование.
mintokenset просто находит набор с наименьшим количеством предметов.
minindex находит, какой столбец внутреннего списка mintokenset соответствует.
Списки имен инициализированы, чтобы иметь достаточно пустых внутренних списков.
Цикл for принимает эту информацию для надлежащего разбиения внутренних списков.
>>> from pprint import pprint as pp
>>>
>>> xlist =[['instructor','plb','error0992'],['instruction','address','00x0993'],['data','address','017x112']]
>>> sets = [set(transposedcolumn) for transposedcolumn in zip(*xlist)]
>>> pp(sets)
[{'instructor', 'data', 'instruction'},
{'plb', 'address'},
{'00x0993', '017x112', 'error0992'}]
>>> mintokenset = min(sets, key=lambda x:len(x))
>>> mintokenset
{'plb', 'address'}
>>> minindex = sets.index(mintokenset)
>>> minindex
1
>>> mintokens = sorted(mintokenset)
>>> mintokens
['address', 'plb']
>>> lists = [[] for _ in mintokenset]
>>> lists
[[], []]
>>> for innerlist in xlist:
lists[mintokens.index(innerlist[minindex])].append(innerlist)
>>> pp(lists)
[[['instruction', 'address', '00x0993'], ['data', 'address', '017x112']],
[['instructor', 'plb', 'error0992']]]
>>>
Исходя из выше каракуля, для больших объемов данных, предположим, он хранится в файле (один внутренний список в каждой строке, разделенные запятой). файл может быть прочитан один раз, а mintokenset и minindex найдены с использованием сложного выражения генератора, которое должно уменьшить потребность в ОЗУ.
Вывод аналогичным образом сохраняется в количестве выходных файлов, если необходимо, с использованием другого выражения генератора для повторного считывания входного файла и ввода записей ввода в соответствующий выходной файл.
Данные должны пропускаться с небольшим общим объемом использования ОЗУ.
from pprint import pprint as pp
def splitlists(logname):
with open(logname) as logf:
#sets = [set(transposedcolumn) for transposedcolumn in zip(*(line.strip().split(',') for line in logf))]
mintokenset, minindex = \
min(((set(transposedcolumn), i)
for i, transposedcolumn in
enumerate(zip(*(line.strip().split(',') for line in logf)))),
key=lambda x:len(x[0]))
mintokens = sorted(mintokenset)
lists = [open(r'C:\Users\Me\Code\splitlists%03i.dat' % i, 'w') for i in range(len(mintokenset))]
with open(logname) as logf:
for innerlist in (line.strip().split(',') for line in logf):
lists[mintokens.index(innerlist[minindex])].write(','.join(innerlist) + '\n')
for filehandle in lists:
filehandle.close()
if __name__ == '__main__':
# File splitlists.log has the following input
'''\
instructor,plb,error0992
instruction,address,00x0993
data,address,017x112'''
logname = 'splitlists.log'
splitlists(logname)
# Creates the following two output files:
# splitlists000.dat
'''\
instruction,address,00x0993
data,address,017x112'''
# splitlists001.dat
'''\
instructor,plb,error0992'''
Все реляционные обои того же размера? – Hyperboreus
На самом деле xlist является подсписком большого списка. biglist разделяется на подэлементы равного размера. xlist - один из них. Таким образом, xlist имеет подсети с равным размером. Infact, мне нужно применить один и тот же процесс ко всем другим подспискам большого списка. – Manoj
Это пахнет плохим выбором структуры данных. У вас есть контроль над входом? Скорее всего, лучше изменить, как данные изначально хранятся, а не пытаться разобрать ваш вывод так всесторонне, чтобы узнать, сколько уникальных значений находится в подэлементе 2 каждого элемента каждого списка! –