Size: a a a

2020 September 10

KK

Kirill (Cykooz) Kuzm... in rannts
Mikhail Fitasov
Это не шутка, это ушло в прод
А бенчмарки были? Насколько это быстрее/медленнее чем просто сравнивать на равенство дикты из первого списка с диктами из второго?
источник
2020 September 11

MF

Mikhail Fitasov in rannts
Kirill (Cykooz) Kuzminykh
А бенчмарки были? Насколько это быстрее/медленнее чем просто сравнивать на равенство дикты из первого списка с диктами из второго?
а как ты будешь дикты сравнивать?
источник

MF

Mikhail Fitasov in rannts
там же set, для уникальности
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Mikhail Fitasov
а как ты будешь дикты сравнивать?
Обычным == они сравниваются нормально. Вот самый тупой вариант через сравнения:

res = []
for d in src:
 if d not in res:
   res.append(d)
источник

RB

Roman Bolkhovitin in rannts
Если склероз мне не врет, то этот финт ушами с сериализацией в json родом из джаваскрипта, и вроде я там тоже так делал, потому что это самый простой способ, а при непосредственном сравнении объектов сравниваются ссылки. Зачем оно в питоне хз ))
источник

RB

Roman Bolkhovitin in rannts
Kirill (Cykooz) Kuzminykh
Обычным == они сравниваются нормально. Вот самый тупой вариант через сравнения:

res = []
for d in src:
 if d not in res:
   res.append(d)
Вот этот сниппет в reduce надо завернуть чтобы очень красиво и не очень понятно было 😊
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Разве что для непонятности, а так только больше вреда т.к. лишние операции будут делаться. Тут же идёт в цикле использование результата предыдущих шагов. Всякие редьюсы не подходят для этого.
источник

SA

Sergey Arkhipov in rannts
Замечательно подходят
источник

SA

Sergey Arkhipov in rannts
Потому что reduce - это foldl, там в аккумуляторе как раз лежит стейт, полученный на предыдущих шагах
источник

RB

Roman Bolkhovitin in rannts
Kirill (Cykooz) Kuzminykh
Разве что для непонятности, а так только больше вреда т.к. лишние операции будут делаться. Тут же идёт в цикле использование результата предыдущих шагов. Всякие редьюсы не подходят для этого.
да хз, вроде норм. хочешь мутируй аккумулятор, хочешь играй в хаскель, выглядит вполне ничего
from functools import reduce

def reducer(acc, el):
 if el not in acc:
   acc.append(el)
 return acc

def pure_reducer(acc, el):
 if el not in acc:
   return [*acc, el]
 return [*acc]

if __name__ == "__main__":
 dicts = [{"a": 1}, {"a": 1, "b": 2}, {"a": 1, "b": 2}, {"a": 1, "b": 2, "c": 3}]
 print(reduce(reducer, dicts, []))
 print(reduce(pure_reducer, dicts, []))
источник

SA

Sergey Arkhipov in rannts
Стейт - не обязательно число. Это может быть, скажем, кортеж. В функциональных языках единственное значение в аккумуляторе во время свёрток - это экзотика, которая бывает только в учебниках. Обычно там минимум 2 значения: целевое и некий агрегат, вроде как раз таки множества уже виденных элементов
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Ну сами видите - через редьюс получается многословно и не понятно. 4 строчки с обычным циклом и так вполне нормально. И работать будет вероятно быстрее, т.к. не надо делать лишних вызовов функций внутри цикла
источник

RB

Roman Bolkhovitin in rannts
Да я согласен, тут "смотри как я могу" больше чем реальных причин так делать ))
источник

SA

Sergey Arkhipov in rannts
Kirill (Cykooz) Kuzminykh
Ну сами видите - через редьюс получается многословно и не понятно. 4 строчки с обычным циклом и так вполне нормально. И работать будет вероятно быстрее, т.к. не надо делать лишних вызовов функций внутри цикла
Это дело привычки на самом деле. Но не суть. Я хотел сказать, что вот такой фильтр - это почти пример из учебника для операций свертки
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Я всё время соотношу reduce  с компрехеншенами. Хотя последние про map и filter, а не про reduce.
источник

РГ

Роман Гладков... in rannts
Не используйте map, filter, reduce. Пожалейте глаза своих коллег
источник

РГ

Роман Гладков... in rannts
itertools норм👌
источник

RB

Roman Bolkhovitin in rannts
Ага, классные, но все время в документацию лазить приходится 😊
источник

in

ildar nizamov in rannts
Роман Гладков
Не используйте map, filter, reduce. Пожалейте глаза своих коллег
а что с глазами случается?
источник

РГ

Роман Гладков... in rannts
очень тяжело переключаться с обычного кода на функциональное пердольство и начинать читать код в обратную сторону. да это коротко, но тяжелочитаемо
источник