gpt4 book ai didi

Python:按唯一值分隔列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:46:20 26 4
gpt4 key购买 nike

我有以下列表。

xlist =[['instructor','plb','error0992'],['instruction','address','00x0993'],['data','address','017x112']]]

我正在尝试实现一种字符串算法,其中一步需要将上述列表分成几个列表。分离准则是首先选择最少数量的唯一标记值,并使用唯一标记值将其分开。 (这里的 token 是内部列表的一个元素)。例如,在上面的 xlist 中,最少数量的唯一标记位于第二个索引 => ('plb','address','address')。所以我需要将此列表分成以下两个列表。

list1 = [['instruction','address','00x0993'],['data','address','017x112']]
list2= [['instructor','plb','error0992']]

我是 python 新手。这是我的第一个项目。有人可以建议我一个好方法吗?也许是一个合适的列表理解?或者我应该遵循的步骤的简要说明。

最佳答案

纯Python,内存中,解决方案。 (当你有 ram 时)

为了获得名称集,我转置 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'''

关于Python:按唯一值分隔列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com