好的,练习是这样的:
#To order a list of strings considering the number of vowels in decreasing order,
#then the whole length in increasing order, then the reverse alphabetical order.
example:
#['pear', 'peach', 'apple', 'banana', 'avocado'] ->
#['avocado', 'banana', 'pear', 'peach', 'apple']
def key_vowels(x):
pass
l = ['pear', 'peach', 'apple', 'banana', 'avocado']
sorted(l) # <- change this to sort with the new key
我尝试用这种方式解决它(最直观的一种),但是预期输出的最后两个元素被交换了:
def key_vowels(x):
vowels = set("aeiouAEIOU")
return sum(1 for char in x if char in vowels), -len(x), x[::-1]
l = ['pear', 'peach', 'apple', 'banana', 'avocado']
sorted(l, key=key_vowels)
经过几次尝试,我想出了这个想法(反转一切),所以:
def key_vowels(x):
vowels = set("aeiouAEIOU")
return sum(1 for char in x if char in vowels), -len(x), x
l = ['pear', 'peach', 'apple', 'banana', 'avocado']
sorted(l, key=key_vowels, reverse=True)
但我仍然无法理解我的第一个方法和最后一个方法有什么区别。预先感谢您!
在第一个示例中,您执行以下操作:
sum(1 for char in x if char in vowels), -len(x), x[::-1]
所以,这就是“单词中元音的数量”,单词的负长度,以及单词本身的倒序。您按升序排序,因此结果将首先显示元音最少的单词,对于元音数量相同的单词,首先显示最长的元音,而对于元音数量相同且长度相同的单词,则按字母顺序排列最后一个单词在前。
如果你运行这个:
l = ['pear', 'peach', 'apple', 'banana', 'avocado']
print({x: key_vowels(x) for x in sorted(l, key=key_vowels)})
这是结果,显示了为什么您会收到您所做的订单:
{'apple': (2, -5, 'elppa'), 'peach': (2, -5, 'hcaep'), 'pear': (2, -4, 'raep'), 'banana': (3, -6, 'ananab'), 'avocado': (4, -7, 'odacova')}
如果您对第二个解决方案执行相同的操作,您会得到以下结果:
{'apple': (2, -5, 'apple'), 'peach': (2, -5, 'peach'), 'pear': (2, -4, 'pear'), 'banana': (3, -6, 'banana'), 'avocado': (4, -7, 'avocado')}
所以,已经存在明显的差异,而且无论如何这都不是“倒置”。但是,除了此更改之外,您还将对
sorted
的调用更改为:
sorted(l, key=key_vowels, reverse=True)
所以,如果你按照上面的方法做同样的事情,你会得到这样的结果:
{'avocado': (4, -7, 'avocado'), 'banana': (3, -6, 'banana'), 'pear': (2, -4, 'pear'), 'peach': (2, -5, 'peach'), 'apple': (2, -5, 'apple')}
现在,您将首先获得最多的元音(而不是最后一个),对于相同数量的元音,首先获得最短的单词,对于相同数量的元音和相同的长度,单词按相反的字母顺序排列。 (这就是被问到的)