ключ python = понимание лямбды и эквивалент c #

#python #lambda #key #min

#python #лямбда #Клавиша #минимум

Вопрос:

Я сам задокументировал функциональность ‘key = lambda’ и нашел хорошую ссылку на ее использование:

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

Мои сомнения, будучи учеником python, хотя и быстро учусь:

1- нужно ли мне отслеживать стек вызовов, чтобы понять, какой «тип» или, проще говоря, «значение» я получаю при извлечении hulls[i][j] ? (Я читал, что python использует «утиный ввод», что объясняет эту необходимость, если я не ошибаюсь).

2- key=lambda j в основном «извлекает» [i][j] элемент оболочек, не так ли? Но означает ли это, что hulls[i][j] это целочисленный тип, поскольку итерация ‘for’ вызывает ‘min’ с for xrange ?

3- необязательно: существует ли эквивалент c # или сопоставимый с python min ?

Заранее спасибо.

Ответ №1:

  1. ДА. В частности, оболочки [i] [j] могут быть любого типа или любого значения в зависимости от того, что произошло во время выполнения. например, все оболочки могут быть целыми числами, но вы можете установить hulls[i][j]='foo' .

  2. Да, лямбда там возвращает j-й элемент i-й строки в оболочках. оболочки [i] [j] могут быть любой сопоставимой вещью, например min('a','b') is 'a'

Комментарии:

1. спасибо за помощь. Итак, что касается второго пункта, пока я могу «минимизировать» любые два типа, это было бы справедливо для python? В принципе, тот факт, что я добавляю ‘xrange’ (который возвращает массив целых чисел, если я не ошибаюсь) с чем-то другим, не означает, что ‘something else’ является int !?! Хах! Я ненавижу нестрогость python 🙂

2. На самом деле, вы не создаете ‘xrange’ с помощью лямбды. небольшая деконструкция: часть xrange создает числа в диапазоне [0,len(оболочки [i])), ключ определяет конкретные значения, которые будут «обработаны». выражается в виде понимания списка, который вам может быть легче читать, а может и нет: j = min([hulls[i][x] for x in xrange(len(hulls[i]))])

3. хахах, это безумие, я бы не понял этого без посторонней помощи. 😀