这句话的解释“list1.sort(key = lambda v:( - v [1],v [0]))”

时间:2014-01-15 06:32:43

标签: sorting python-2.7

我需要在以下python程序中解释v:(-v[1],v[0]) v在此处的含义以及-v[1]v[0]的含义是什么?

def top_chars(word, n):
    counts = Counter(word)
    list1 = []
    list1 = counts.most_common()
    list1.sort(key=lambda v: (-v[1], v[0]))
return list1[0:n]

对于word =“aaaaabbbbcccc” 请解释给定单词的函数v

2 个答案:

答案 0 :(得分:0)

语句lambda v: (-v[1], v[0])定义了一个函数。该函数可以分配给名称并用作函数。因此:

>>> f = lambda v: (-v[1], v[0])
>>> f( (1, 2) )
(-2, 1)

v可以是任何至少包含两个元素的列表或元组。该函数返回一个元组,该元组由第二个元素的负数后跟第一个元素的正数组成。

更多信息:当word =“aaaaabbbbcccc”时,让我们考虑top_chars函数。在这种情况下,list1 = counts.most_common()的结果是:

[('a', 5), ('c', 4), ('b', 4)]

请注意,list1有三个元素,每个元素都是一个由一个字符和一个数字组成的元组。下一行(具有lambda函数的行)根据上面f给出的键对此进行排序。让我们看看flist1中每个元组的作用{/ 1}}:

>>> f( ('a', 5) )
(-5, 'a')
>>> f( ('c', 4) )
(-4, 'c')
>>> f( ('b', 4) )
(-4, 'b')

首先,sort检查密钥的第一个元素,在这种情况下,是数字。这些数字中最小的是-5。所以sort首先将('a',5)置于排序列表中。下一个最小值是-4。但是,有两个排名为-4。要选择将下两个中的哪一个放入列表中,sort必须检查密钥的第二个值。在这种情况下,第二个值是'b'和'c'。由于'b'在'c'之前排序,sort将('b',4)放在下一个列表中,然后('c',4)放在它之后。这解释了为什么最终结果是:

>>> list1.sort(key=lambda v: (-v[1], v[0]))
>>> list1
[('a', 5), ('b', 4), ('c', 4)]

答案 1 :(得分:0)

lambda v: (-v[1], v[0])是一个lambda expression,基本上是一个紧凑的匿名函数。它相当于:

def func(v):
    return (-v[1], v[0])

...除了它没有名称,但你可以为lambda函数指定名称,例如func = lambda v: (-v[1], v[0])

现在,sort()对象的list方法接受一个可选的关键字参数key=,它应该是一个接受一个参数的函数(在本例中称为v })。列表将按照key传递的函数的返回值进行排序。这意味着list1由迭代(例如字符串,列表,元组)组成,我们现在v将根据元组排序,其元素的第一个元素为负{ {1}} {1}}元素,其第二个元素是1的{​​{1}}元素。 (例如,如果v,则0。)