簡體   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