如何从元组列表中找到前3个频率元素?

时间:2015-10-30 11:55:21

标签: python list python-2.7 tuples

d=[[(u'BAKING', 51)], [(u'ACCESS', 4)],[(u'CUTE', 2)], [(u'RED', 3)],[(u'FINE', 59)], [(u'ACCESS', 49)],[(u'YOU', 97)], [(u'THANK', 41)]]

我有一个包含单词及其相应频率的元组列表。现在如何从这些中找到前3个频率词?

t=[]
for items in d:
k=items[0]
print len(k)
for j in k:
    t.append(j)
print t
m=[t[i:i+2] for i  in range(0, len(t), 2)]
print m
j=Counter(m)

这是给我错误,m是列表它应该是字典:(如何将其转换为字典

2 个答案:

答案 0 :(得分:2)

您可以使用itemgetteritertools.chain完成此任务:

from operator import itemgetter
from itertools import chain

sorted(list(chain.from_iterable(d)),  key=itemgetter(1), reverse=True)[0:3]

这会给你:

[(u'YOU', 97), (u'FINE', 59), (u'BAKING', 51)]

一些解释:chain命令会展开列表列表,以便最终得到一个元组列表(这些元组可能比元组列表更容易处理)。然后使用itemgetter根据元组的第二个元素对此列表进行排序,然后选择前三个元素。

编辑:

请阅读您对多个条目的评论。一种方法是:

import collections
from operator import itemgetter
from itertools import chain

result_dict = collections.defaultdict(list)
newL = list(chain.from_iterable(d))
for tu in newL:
     result_dict[tu[0]].append(tu[1])

这会给你

defaultdict(<type 'list'>, {u'CUTE': [2], u'BAKING': [51], u'THANK': [41], u'ACCESS': [4, 49], u'YOU': [97], u'FINE': [59], u'RED': [3]})

现在你可以总结得到列表中条目的总和,如下所示:

res = {k: sum(v) for k,v in result_dict.iteritems()}

以及最好的三个项目:

sorted(res.iteritems(), key=itemgetter(1), reverse=True)[0:3]

在这种情况下,它是:

[(u'YOU', 97), (u'FINE', 59), (u'ACCESS', 53)]

答案 1 :(得分:2)

我更喜欢:

sorted(d, key = lambda x: x[0][1], reverse = True)