我有以下列表清单。
xlist =[['instructor','plb','error0992'],['instruction','address','00x0993'],['data','address','017x112']]]
我正在尝试实现一个字符串算法,其中一步需要将上面的列表分成几个列表。分离标准是首先选择最少数量的唯一标记值,并使用唯一标记值将其分开。 (这里的标记是内部列表的一个元素)。例如,在上面的xlist中,第二个索引中的最小数量的唯一令牌驻留=> ( 'PLB', '地址', '地址')。所以我需要将这个列表分成以下两个列表。
list1 = [['instruction','address','00x0993'],['data','address','017x112']]
list2= [['instructor','plb','error0992']]
我是python的新手。这是我的第一个项目。有谁能建议我一个好方法?也许是一个合适的列表理解?或者我应该遵循的步骤的简要说明。
答案 0 :(得分:2)
纯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'''
答案 1 :(得分:1)
既然你提到它会是一个大数据集(有多大?),我认为pandas
可能是最好的方法。
In [1]:
import numpy as np
import pandas as pd
In [4]:
xlist =[['instructor','plb','error0992'],['instruction','address','00x0993'],['data','address','017x112']]
df=pd.DataFrame(xlist, columns=['c1','c2','c3'])
In [6]:
set(df['c2'])
Out[6]:
{'address', 'plb'}
In [11]:
print df[df['c2']=='address']
c1 c2 c3
1 instruction address 00x0993
2 data address 017x112
In [12]:
print df[df['c2']=='plb']
c1 c2 c3
0 instructor plb error0992