![](/img/trans.png)
[英]Efficiently get all lines starting with given string for a large text file
[英]Counting frequencies(efficiently) of strings in a large text file when their pre-counts are given
我有以下形式的清单清单:
[['about70-130 characters long string', '332'], ['someotherrandomstring','2'], ['about70-130 characters long string', 32], ['someotherrandomstring', '3333']]
要做:我最终想对所有重复的字符串的大小求和,如下所示:
[['about70-130 characters long string',364], ['someotherrandomstring',3335]]
我写了一个蛮力的代码来解决这个问题,但是这花了我很多时间,因为该列表大约有200万个列表。 我编写的效率很低的代码是:
final = {}
for element in both_list:
size = int(element[1])
if element[0] not in final.keys():
final[element[0]] = size
else:
final[element[0]] += size
我很确定有一个更省时的代码,但是我似乎没有任何想法。 任何帮助和正确方向的指导将不胜感激。 谢谢。
如果您可以使用第三方图书馆熊猫
import pandas as pd
a=[['about70-130 characters long string', '332'],
['someotherrandomstring','2'],['about70-130 characters long string', 32],['someotherrandomstring', '3333']]
df=pd.DataFrame(a,columns=['label','counts'])
df.counts=df.counts.astype('int')
df.groupby('label')['counts'].sum().to_dict()
它可能比您的解决方案快一点
a=[['about70-130 characters long string', '332'],
['someotherrandomstring','2'],['about70-130 characters long string', 32],['someotherrandomstring', '3333']]
d={}
for i in a:
if i[0] not in d:
d[i[0]]=d.get(i[0],int(i[1]))
else:
d[i[0]]=d.get(i[0])+int(i[1])
将itertools.groupby
与operator.itemgetter
或lambda
from itertools import groupby
from operator import itemgetter
lst = sorted(lst, key=itemgetter(0))
res = []
for k, g in groupby(lst, key=itemgetter(0)):
res.append([k, sum([int(i[1]) for i in list(g)])])
print(res)
# [['about70-130 characters long string', 364], ['someotherrandomstring', 3335]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.