![](/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.