题目内容:某些英语单词的字母经过重新排列后,能获得另外一个单词,如可以将“cinema”转换成另一个单词“iceman”。编写程序,将词表中由相同字母组成的单词聚成一类,并按照单词个数由多到少的顺序输出各类中的全部单词(每类占一行,单词按字典序由小到大排列,之间用空格分隔),若每类中单词个数相同,则按每类中第一个单词的字典序由大到小输出各个类别。
输入格式:按字典序由小到大输入若干个单词,每个单词占一行。
输出格式:按照单词个数由多到少的顺序输出各类中的全部单词(每类占一行,单词按字典序由小到大排列,之间用空格分隔),若每类中单词个数相同,则按每类中第一个单词的字典序由大到小输出各个类别。
思路
- 将单词拆成以字母为元素的元组作为字典的键(key),将单词作为字典的值(value),从而实现分类
- 字典的值要根据字典序由小到大排列
- 字典排列:先根据值的第一个单词字典序由大到小排列,再根据值的元素个数由大到小排列。
def get_words():
words = []
while True:
s = input()
if s != '':
words.append(s)
else:
break
return words
#输入:以列表储存
def get_dic(words):
dic = {}
for word in words:
x = tuple(sorted(word)) #只有元组可以用hash形式储存
if x in dic:
dic[x].append(word)
else:
dic[x] = [word]
return dic
#构造字典
d = get_dic(get_words())
for w in d.values():
w.sort()
#值根据字典序由小到大排列
d = sorted(d.items(), key=lambda x: x[1][0], reverse=True)
#根据值的第一个单词字典序由大到小排列
d = sorted(d, key=lambda x: len(x[1]), reverse=True)
#根据值的元素个数由大到小排列
for a, b in d:
print(" ".join(b))