如何在字典中找到最短和最长的单词

时间:2013-11-22 15:37:12

标签: python dictionary python-3.3

我正在尝试找到给定字典中的最短单词和最长单词,其中键是单词。当我对字典进行排序时,下面的代码不会这样做。我得到“和”的短裤和“你的”多头。有什么问题?

def build_report(freq):
    report={}
    #for shorts:
    sorted(freq.keys())
    print(sorted(freq.keys()))
    shortest=sorted(freq.keys())[0]
    shorts=list()
    shorts.append(shortest)
    print(shorts)
    report["shorts:"]=shorts
    #for longs:
    longest=sorted(freq.keys(),reverse=True)[0]
    print(sorted(freq.keys(),reverse=True))
    longs=list()
    longs.append(longest)
    print(longs)
    report["longs:"]=longs

这是我正在输入的频率:

freq={'I': 1, 'heaven': 1, 'filled': 1, 'their': 1, 'termed': 1, 'of': 4, 'And': 3, 'parts': 1, 'neer': 1, 'to': 2, 'song': 1, 'poets': 1, 'The': 1, 'a': 2, 'were': 2, 'verse': 1, 'your': 6, 'knows': 1, 'not': 1, 'half': 1, 'number': 1, 'but': 1, 'yours': 1, 'come': 2, 'rage': 1, 'age': 2, 'Though': 1, 'men': 1, 'fresh': 1, 'heavenly': 1, 'say': 1, 'alive': 1, 'truth': 1, 'this': 1, 'If': 2, 'than': 1, 'old': 1, 'believe': 1, 'Which': 1, 'that': 1, 'You': 1, 'faces': 1, 'yet': 1, 'poet': 1, 'in': 4, 'life': 1, 'most': 1, 'earthly': 1, 'will': 1, 'hides': 1, 'my': 3, 'papers': 1, 'is': 1, 'stretched': 1, 'rights': 1, 'eyes': 1, 'it': 3, 'yellowed': 1, 'Such': 1, 'So': 1, 'all': 1, 'lies': 1, 'the': 1, 'an': 1, 'as': 1, 'write': 1, 'child': 1, 'deserts': 1, 'shows': 1, 'tongue': 1, 'twice': 1, 'Be': 1, 'high': 1, 'some': 1, 'could': 1, 'should': 2, 'and': 2, 'touched': 1, 'like': 1, 'would': 1, 'Who': 1, 'tomb': 1, 'numbers': 1, 'antique': 1, 'scorned': 1, 'metre': 1, 'time': 2, 'touches': 1, 'be': 1, 'with': 2, 'true': 1, 'beauty': 1, 'rhyme': 1, 'less': 1, 'But': 1, 'graces': 1, 'live': 1}

1 个答案:

答案 0 :(得分:5)

您按字典顺序(按字母顺序)按键排序,而不是按长度排序。

你也经常对它们进行排序。只按一次排序:

keys = sorted(freq, key=len)
shortest, longest = keys[0], keys[-1]

因为字典在迭代时只产生键,所以你甚至不需要在这里调用.keys()

演示:

>>> keys = sorted(freq, key=len)
>>> shortest, longest = keys[0], keys[-1]
>>> shortest
'I'
>>> longest
'stretched'

如果您需要与第一个相同长度的所有单词:

shortest = [keys[0]]
for key in keys[1:]:
    if len(key) == len(shortest[0]):
        shortest.append(key)
    else:
        break
longest = [keys[-1]]
for key in reversed(keys[:-1]):
    if len(key) == len(longest[0]):
        longest.append(key)
    else:
        break

或更高级,使用itertools.groupby()

from itertools import groupby
keys = sorted(freq, key=len)
shortest = list(next(groupby(keys, key=len))[1])
longest = list(next(groupby(reversed(keys), key=len))[1])