2

Что бы вы назвали функцией, которая принимает список и функцию, и возвращает значение True, если применение функции ко всем элементам дает тот же результат?Существует ли стандартное имя для этой функции?

def identical_results(l, func): 
    if len(l) <= 1: return True 
    result = func(l[0]) 
    for el in l[1:]: 
     if func(el) != result: 
      return False 
    return True 

Есть ли приятное общепринятое название для этой вещи? Бонус, если вы можете реализовать в менее неуклюжем стиле.

ответ

5

В .NET ближе всего Array.TrueForAll.

Возможно, SameForAll был бы более подходящим для этой функции?

+0

@ Dario: Читайте снова. Я отредактировал после моего последнего комментария. –

+0

О, thx: SameForAll действительно лучшее предложение, которое я еще слышал. – Dario

0

same_results звучит как разумное имя для меня.

1

не могу придумать хорошее название до сих пор, но это один делает то же самое:

def identical_results(l, func): 
    return len(set(map(func, l))) <= 1 
+2

Очень сжатый код, но неэффективен, так как для создания набора требуется O (n log n), тогда как алгоритму нужно просто O (n). – Dario

+0

@ Dario: Правда, если это проблема. – balpha

+0

Да, правая идея balpha. reduce() будет объединять результаты без создания набора: def identity_results (l, func): return reduce (lamdba x, y: x и y, map (func, l)) Поскольку это карта + уменьшить, это также очень масштабируемо (см. документ Google Mapreduce). –

4

havn't слышал о специальном название для этого еще (немного похож на Forall, но не совсем) , IdenticalResults кажется, хорошо так (Jon Seigel предложил SameForAll, также довольно хороший)

Дополнительно: Это способ можно реализовать это в Haskell, используя all функцию (TrueForall под .NET)

ident [] = True 
ident (x:xs) = all (== x) xs 

sameForAll f = ident . map f 

И Python:

def idents(f, list): 
    if len(list) <= 1: 
     return True 
    else: 
     let fx0 = f(list[0]) 
     return all((f(x) == fx0 for x in list[1:])) 
+0

это довольно много, если функция постоянна над доменом. – nlucaroni

+0

Не уверен в Haskell, но, похоже, python возвращает True, если все элементы идентичны. Это круто, потому что теперь я могу назвать 'idents (map (f, list))' для реализации SameForAll. Исправьте свой код, чтобы я мог дать вам возвышенность ... – itsadok

+0

К сожалению, я просто забыл применить f ;-) – Dario

0

Я отправил это в указанном выше комментарии, но форматирование получил перепутались, так вот она снова для ясности:

def identical_results(l, func): 
    return reduce(lamdba x,y: x and y, map(func, l)) 
+0

Я думаю, что у вас есть правильная идея, но, как и сейчас, вы внедрили TrueForAll вместо SameAll – itsadok

+0

. Я думал, что функция может выполнять всю работу (и может), но, вероятно, было бы лучше, если бы уменьшить проверочный массив и добавить только новые значения. Тем не менее, в любом случае это будет набор, как, например, balpha. –

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