繁体   English   中英

给定它们的前计数后,有效地计算大型文本文件中字符串的频率

[英]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.groupbyoperator.itemgetterlambda

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM