双重排序由一个字符串元组组成的Dict,作为键,整数作为值,首先按元组中的第一个字符串,然后按值Integer Python 3

2024-09-29 01:31:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.5.2,我有一个dict,它包含一个字符串元组作为“keys”,而作为“values”包含一个来自计数的整数。我想做一个双重排序,其中第一个优先级是键中的第一个字符串,第二个优先级是整数值。有关更深入的解释,请参见下文:

例如,我有一句话:

>>> print(unorderedDict.items())
dict_items([(('has', 'accomplished'), 1), (('new', 'french'), 1), (('pieces', 'machinery'), 1), (('in', 'those'), 1), (('east', 'on'), 1), (('sectarian', 'principles'), 1), ((',', 'are'), 10), (('all', 'countries'), 2)......])

它包含两个字符串的元组,例如('has', 'accomplished')和一个整数ex.1的值作为键。例如,所有人:([(('all', 'countries'), 2)])。在

这本质上包含文本中找到的所有单词的唯一组合,以元组形式作为键,以及在文本中以整数形式出现的单词的唯一组合的次数。在

我想要一种对unorderedDict排序的方法,第一个按键元组中的第一个字符串排序,第二个按值排序。在

这样做的目的是让我有一个单词列表,加上最有可能跟在它后面的单词,然后在列表中的下一个单词加上下一个最有可能跟在后面的单词。在

输出示例:

^{pr2}$

请注意它是如何首先按元组中的第一个字符串(按字母顺序)排序,然后按值(从数字上从高到低)排序。在

为了执行这种排序算法,我需要什么python3代码?在

需要这种排序算法的主要原因是,我可以随机选择元组中的第一个字符串之一,然后获取元组中更经常找到的第二个字符串(由Count中的整数标识)。在

例如,我可以随机选择“all”,然后看到后面跟“the”的可能性比后面跟“of”的可能性大(vount of‘the’=10,vount of‘of’=7)。在

根据我自己的研究,我认为这可能与内置的dict排序方法和lambda有关,但这对我来说是一个新领域,所以我真的没有线索。在


Tags: of字符串文本排序items整数all单词
1条回答
网友
1楼 · 发布于 2024-09-29 01:31:57

基本上,这可以用^{}完成:

from collections import OrderedDict
OrderedDict(sorted(unorderedDict.items(), key=lambda x: (x[0][0], x[1])))
#                                 first string of key  ^^^^^^^  ^^^^ -value

不过,我认为您应该考虑使用另一种数据结构。例如,list的无序dict似乎是一个不错的选择,因为您只对第一个单词后面最常见的单词感兴趣:

^{pr2}$

没有订购外字典是因为我怀疑它不需要(如果应该的话,我不知道该怎么做)。在


另一种选择可以是^{}作为内部结构,因为它有一个很好的^{}方法:

from collections import Counter

result = {}

for (key1, key2), counts in unorderedDict.items():
    if key1 not in result:
        result[key1] = Counter()
    result[key1][key2] = counts

>>> result['has'].most_common()  # returns it sorted!!!
[('done', 5), ('failed', 3), ('accomplished', 1)]

>>> result['has'].most_common(1)
[('done', 5)]

>>> result['has']['failed']  # can be accessed like a dictionary too
3

相关问题 更多 >