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