这两种Python排序方式在技术上有什么区别?

问题描述 投票:0回答:1

好的,练习是这样的:

#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)

但我仍然无法理解我的第一个方法和最后一个方法有什么区别。预先感谢您!

python sorting key
1个回答
0
投票

在第一个示例中,您执行以下操作:

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')}

现在,您将首先获得最多的元音(而不是最后一个),对于相同数量的元音,首先获得最短的单词,对于相同数量的元音和相同的长度,单词按相反的字母顺序排列。 (这就是被问到的)

© www.soinside.com 2019 - 2024. All rights reserved.