查找具有最大int值的对列表(string,int)中的字符串集

时间:2016-10-05 15:26:50

标签: python string set max

我有一个(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)

我能想到的解决方案是循环遍历列表。但有没有优雅的方法呢?

3 个答案:

答案 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

公平地说,它们都非常快速,在你的情况下,可读性可能更重要。