繁体   English   中英

您能解释一下此Python列表理解吗?

[英]Can you explain this Python list comprehension?

def get_max(r, a, b):
    """ Returns the maximum value in the form (index, value). """
    return max([(x+a, r[a:b][x]) for x in xrange(len(r[a:b]))], key=lambda x:x[1])

谁能解释这个列表理解的作用?

为了提高效率,避免重复重复r的切片是一个好主意

chunk = r[a:b]
[(x+a, chunk[x]) for x in xrange(len(chunk))]

我认为这也使代码的含义更清晰了(不是完全Pythonic)

chunk = r[a:b]
[(i, j) for i, j in enumerate(chunk, a)]

哦,这是身份列表理解

list(enumerate(chunk, a))

因此,您可以说,而不是所有的华夫饼干

def get_max(r, a, b):
    """ Returns the maximum value in the form (index, value). """
    return max(enumerate(r[a:b], a), key=lambda x:x[1])

正如@vonPetrushev试图在注释中解释的那样,您可以将lambda函数替换为itemgetter。

from operator import itemgetter
def get_max(r, a, b):
    """ Returns the maximum value in the form (index, value). """
    return max(enumerate(r[a:b], a), key=itemgetter(1))

性能差异不大,且itemgetter版本更具描述性(只要您知道itemgetter作用)

让我们将其分解成碎片。

首先,这只是listcomp本身:

[(x+a, r[a:b][x]) for x in xrange(len(r[a:b]))]

这等效于以下循环:

result=[]
for x in xrange(len(r[a:b])):
    result.append((x+a, r[a:b][x]))

那么,每个部分做什么?

r[a:b]r从索引a(包括)到b(不包括)的子序列。 所以len(r[a:b])几乎是说ba一种奇特的方式,但不是很正确-因为b可能在序列的末尾,或者其中一个索引可能是负索引。 xrange(len(r[a:b]))只是从0到该长度的所有数字(再次除外)。

现在,对于从0到该长度的每个数字x ,我们创建一个元组(x+a, r[a:b][x])

让我们来看一个例子:

>>> r = ['a', 'b', 'c', 'd', 'e', 'f']
>>> a = 2
>>> b = 4
>>> r[a:b]
['c', 'd']
>>> len(r[a:b])
2
>>> list(xrange(len(r[a:b])))
[0, 1]
>>> x=0
>>> (x+a, r[a:b][x])
(2, 'c')
>>> x = 1
>>> (x+a, r[a:b][x])
(3, 'd')

因此,正如您所看到的,它正在为ab的索引创建一个(index,value)列表,如下所示:

[(2, 'c'), (3, 'd')]

编写相同内容的一种更好的方法是:

>>> list(enumerate(r))[a:b]
[(2, 'c'), (3, 'd')]

… 要么 …

>>> list(enumerate(r[a:b], a)
[(2, 'c'), (3, 'd')]

r是一个序列, a是一个起始索引, b是一个结束索引。 列表推导将给出(index, r[index])元组的列表,其中a <= index < b 然后, max()调用将返回具有max()的元组(元组中的第二项)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM