我有一个(str,int)
对
list_word = [('AND', 1), ('BECAUSE', 1), ('OF', 1), ('AFRIAD', 1), ('NEVER', 1), ('CATS', 2), ('ARE', 2), ('FRIENDS', 1), ('DOGS', 2)]
这基本上表示每个单词出现在文本中的次数。
我想得到的是具有最大出现次数的单词集以及最大出现次数。所以,在上面的例子中,我想得到
(set(['CATS', 'DOGS','ARE']), 2)
我能想到的解决方案是循环遍历列表。但有没有优雅的方法呢?
答案 0 :(得分:2)
两次线性扫描,首先找到最大元素:
maxcount = max(map(itemgetter(1), mylist))
然后一秒钟拉出你关心的值:
maxset = {word for word, count in mylist if count == maxcount}, maxcount
如果您需要获取的集合不仅仅是最大计数,您可以使用collections.defaultdict
在一次通过中按计数累积:
from collections import defaultdict
sets_by_count = defaultdict(set)
for word, count in mylist:
sets_by_count[count].add(word)
然后allcounts = sorted(sets_by_count.items(), key=itemgetter(0), reverse=True)
可以跟随list
count, set
个 The problem:
During the Xcode 7 to 8 upgrade, code added by my constituents was not Pulled
into my Xcode, thus causing a Not Possible to Fast Forward error.
对,从最高到最低计数(排序工作最少,因为它只排序了很多项目对于独特的计数,而不是所有的单词)。
答案 1 :(得分:0)
使用键将list
转换为dict
作为计数,将值转换为单词集。找到key的max
值,以及它的相应值
from collections import defaultdict
my_list = [('AND', 1), ('BECAUSE', 1), ('OF', 1), ('AFRIAD', 1), ('NEVER', 1), ('CATS', 2), ('ARE', 2), ('FRIENDS', 1), ('DOGS', 2)]
my_dict = defaultdict(set)
for k, v in my_list:
my_dict[v].add(k)
max_value = max(my_dict.keys())
print (my_dict[max_value], max_value)
# prints: (set(['CATS', 'ARE', 'DOGS']), 2)
答案 2 :(得分:0)
虽然更多的pythonic解决方案在眼睛上肯定更容易,但不幸的是,需要进行两次扫描,或构建您并不真正想要的数据结构的速度要慢得多。
以下相当无聊的解决方案比dict解决方案快约55%,比基于提供的示例数据(以及我的实现,机器,基准测试等)的基于理解的解决方案快约70%。
这几乎可以肯定到这里的单次扫描而不是两次。
word_occs = [
('AND', 1), ('BECAUSE', 1), ('OF', 1), ('AFRIAD', 1), ('NEVER', 1),
('CATS', 2), ('ARE', 2), ('FRIENDS', 1), ('DOGS', 2)
]
def linear_scan(word_occs):
max_val = 0
max_set = None
for word, occ in word_occs:
if occ == max_val:
max_set.add(word)
elif occ > max_val:
max_val, max_set = occ, {word}
return max_set, max_val
公平地说,它们都非常快速,在你的情况下,可读性可能更重要。