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是列表它应该是字典:(如何将其转换为字典
答案 0 :(得分:2)
您可以使用itemgetter
和itertools.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)