2011-11-05 44 views
0

我已经证明自己关于“键=拉姆达”的功能,并发现其使用一个很好的参考:蟒蛇键=拉姆达理解和C#相当于

http://www.daniweb.com/software-development/python/threads/376964

感谢我才明白做下面的代码是“应该”是什么:

def _min_hull_pt_pair(hulls): 
    """Returns the hull, point index pair that is minimal.""" 
    h, p = 0, 0 
    for i in xrange(len(hulls)): 
     j = min(xrange(len(hulls[i])), key=lambda j: hulls[i][j]) 
     if hulls[i][j] < hulls[h][p]: 
      h, p = i, j 
    return (h, p) 

但是我有下面的语法问题:

 j = min(xrange(len(hulls[i])), key=lambda j: hulls[i][j]) 

我怀疑,是一条巨蟒学徒尽管快速学习:

1,我需要追溯调用堆栈像明白了什么“型”或者更简单的“价值”我得到检索hulls[i][j]? (我读过python使用'duck typing',这可以解释这种需求,如果我没有弄错的话)。

2- key=lambda j基本上'检索'外壳的[i][j]元素,不是吗?但是这是否意味着hulls[i][j]是一个整数类型,因为'for'迭代使用for的xrange来调用'min'?

3-可选:是否存在与Python的min相当或可比较的c#?

在此先感谢。

回答

1
  1. 是的。特别是,根据运行时发生的情况,船体[i] [j]可以是任何类型或任何值。例如所有的船体可以是整数,但你可以设置hulls[i][j]='foo'

  2. 是的,lambda返回船体第i行的第j个元素。船体[i] [j]可以是任何类似的东西,例如min('a','b') is 'a'

+0

感谢您的帮助。所以关于第二点,只要我能'分'任何两种类型,这对蟒蛇公平吗?基本上,我用'别的'xrange'(如果我没有弄错的话返回一个int数组)的事实并不意味着'别的'是int!!哈!我讨厌python的不严格:) – roamcel

+1

事实上,你并没有用lambda来制定'xrange'。解构一点:xrange部分构造范围[0,len(hulls [i]))中的数字,key定义将被“缩小”的特定值。表达为一个列表理解,你可能会发现也可能不会更容易阅读:'j = min([shell] [i] [x] for x in xrange(len(hulls [i]))])' – ryanbraganza

+0

haha​​h that's crazy ,如果没有帮助,我不会得到它。 :d – roamcel