У меня есть список списков кортежей. Каждый кортеж имеет форму (string,int)
, например.Каков самый быстрый способ комбинировать и сортировать списки кортежей?
lst = list()
lst.append([('a',5),('c',10),('d',3),('b',1)])
lst.append([('c',14),('f',4),('b',1)])
lst.append([('d',22),('f',2)])
Think из int
-х, как эпизоды каждой строки в различных блоках текста.
Что мне нужно сделать, это создать список топ-N
возникающих строк вместе с их совокупными значениями. Таким образом, в приведенном выше примере, a
появляется в 5 раз, b
появляется дважды, c
появляется 24 раз и т.д. Если N=2
, то я должен был бы производить либо пару параллельных списков ['d','c']
и [25,24]
или список кортежей [('d',25),('c',24)]
. Мне нужно сделать это как можно быстрее. У моей машины много оперативной памяти, поэтому память не является проблемой.
У меня есть эта реализация:
import numpy as np
def getTopN(lst,N):
sOut = []
cOut = []
for l in lst:
for tpl in l:
s = tpl[0]
c = tpl[1]
try:
i = sOut.index(s)
cOut[i] += c
except:
sOut.append(s)
cOut.append(c)
sIndAsc = np.argsort(cOut).tolist()
sIndDes = sIndAsc[::-1]
cOutDes = [cOut[sir] for sir in sIndDes]
sOutDes = [sOut[sir] for sir in sIndDes]
return sOutDes[0:N],cOutDes[0:N]
Там Должен быть лучший путь, но что бы это было?
Есть ли причина, почему список списков кортежей? Разве проблема становится другой, если мы просто изменим ее на список из 2-х кортежей? – EelkeSpaak
collections.Counter – RemcoGerlich
* Думайте о int как о подсчете каждой строки в разных блоках текста. * - почему бы не 'collections.Counter'? – GingerPlusPlus