Python字典按键和值

时间:2018-03-13 17:24:40

标签: python

任务: 频率分析仪。从txt文件中读取文本。在文本中输出一个单词一行的单词。单词必须按降序排序,如果某些单词具有相同的频率,则应按字典顺序排序。

在我的文本解析后的实现中,我们有一个对词典,例如('word',frequency),例如('hello',20)。所以问题是如何编写谓词以获得所需的结果。这是我的逻辑: 伪代码 按频率desc排序,直到得到相等的频率, 当相等的频率满足时,按词的词典顺序排序。 我的代码看起来像这样,但测试机输出“时间限制超过”,可能是因为排序两次。

wordlist = []
    with open('words.txt','r') as f:
wordlist = [word for line in f for word in line.split()]
words = dict(zip(wordlist,[wordlist.count(p) for p in wordlist]))
dic = []
for key,val in words.items():
    dic.append((key,val))
dic.sort(key=lambda a: (a[0]), reverse=False)
dic.sort(key=lambda a: (a[1]), reverse=True)
for word in dic:
    print(word[0])

1 个答案:

答案 0 :(得分:0)

由于元组的第二个元素是数字,您可以通过反转数字本身来反转排序的方向,这意味着您只需要使用适当的键进行一次排序。

dic.sort(key=lambda a: (-a[1], a[0]))

但是,sorted的返回值直接使用words.items()会稍微简单一些:

dic = sorted(words.items(), key=lambda a: (-a[1], a[0]))

如果您不能使用负数技巧,则必须编写显式比较函数并使用functools模块将其转换为密钥。

def tup_compare(t1, t2):
    w1, c1 = t1
    w2, c2 = t2
    if w1 < w2:
        return 1
    elif w1 > w2:
        return -1
    elif c1 < c2:
        return -1
    elif c1 == c2:
        return 0
    else:
        return 1
dic = sorted(words.items, key=functools.cmp_to_key(tup_compare))