純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使用一個複雜的生成器表達式來發現,該表達式可以降低RAM的要求。
使用另一個生成器表達式第二次讀取輸入文件並將輸入記錄切換到相應的輸出文件時,輸出類似地存儲在儘可能多的輸出文件中。
數據應該流經很少的整體RAM使用量。
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的子列表。 biglist被分成相同大小的子列表。 xlist就是其中之一。所以xlist具有相同大小的子列表。事實上,我需要對biglist的所有其他子列表應用相同的過程。 – Manoj
這種糟糕的數據結構選擇。你有任何控制輸入?改變數據最初的存儲方式可能會更好,而不是試圖如此全面地分析輸出,以便知道每個列表中每個元素的子元素2中有多少個唯一值! –