2014-01-28 4 views
2

мне интересно, если есть более емкий метод делает следующее:Предложения по изменению функции в выражении карты

Когда h, t, r являются Numpy массивов, я хочу сделать следующее:

hL, tL, rL = map(lambda m: len(set(m)), [h, t, r]) 

, который вычисляет количество не повторяющихся элементов в отдельных массивах. Однако выражение лямбда торчит как больной палец. Если бы не повторная вещь не была проблемой, я бы написал:

hL, tL, rL = map(len, [h, t, r]) 

Который намного круче. Мы полностью отказались от лямбда-выражения. После баловался в Haskell в течение нескольких месяцев, я действительно начинаю верить, что Python должен быть в состоянии предоставить оператору СЦЕПЛЕНИЕ как . в Haskell так, что первое выражение может быть просто сводится к следующему:

hL, tL, rL = map(len . set, [h, t, r]) 

Который намного лучше !!

Я видел что-то, что использует метод reduce для этого, но это просто более уродливо, чем предыдущий метод. Интересно, знает ли кто-нибудь, что они знают об этом, может решить проблему? Я знаю, что есть проблемы с нестрогой оценкой, что может сделать программы неустойчивыми, но когда мы работаем над простыми вещами вроде этого, это не должно быть проблемой?

ответ

3

Python не предоставляет оператора композиции.

Как насчет использования list comprehension?

>>> h = [1,2,3] 
>>> t = [1,1,1,1] 
>>> r = [1,2,2,1] 
>>> hL, tL, rL = [len(set(m)) for m in h, t, r] 
>>> hL, tL, rL 
(3, 1, 2) 
+0

на самом деле это выглядит лучше. Благодаря! – ssm

4

Для вычисления количества уникальных элементов в массиве Numpy, вы можете использовать unique(x).size или len(unique(x)) (см numpy.unique). Если вы действительно хотите сделать расчет из трех длин «один-лайнер», вы могли бы написать:

hL, tL, rL = [len(unique(x)) for x in h, t, r] 

В случае, если это важно для средних и больших массивов, unique(x) может быть намного быстрее, чем set(x), но для небольших массивов, set(x) быстрее. (Я не изучал производительность по широкому диапазону размеров массивов и типов данных, поэтому оставляю «большие» и «маленькие» неопределенными. Протестируйте их самостоятельно, но только в том случае, если этот код является узким местом производительности.)

+0

Мне очень нравится этот ответ Спасибо! – ssm

Смежные вопросы