Привет, я должен написать функцию CustomOp(d)
, которая принимает dict d и используется следующим образом:
dict(map(CustomOp(d), d.items()))
Предполагается, что функция помогает изменять значения dicts на основе следующих условий:
Кроме того, функция CustomOp(d)
должна быть написана в одну строку кода (без учета заголовка)
Вот что я смог сделать до сих пор. Рекомендуется действовать осторожно!
def UseOp(d):
return dict(map(CustomOp(d), d.items()))
def CustomOp(d):
return lambda t:tuple([t[0],t[1]*2]) if all(type(v)==int for v in d.values()) else lambda t:tuple([t[0],t[1][::-1]]) if all(type(v)==str for v in d.values()) else lambda t:t
Он работает только тогда, когда Dict содержит только целые числа, иначе я получаю:
TypeError: невозможно преобразовать элемент последовательности обновления словаря #0 в последовательность
Я понятия не имею, как заставить эту линию работать и как можно сделать ее короче, и после значительного количества времени я решил сдаться и попросить вас, ребята.
И можете ли вы сделать 1. 2. и 3. по отдельности? Я бы тоже сначала попробовал.
запуск вашего кода с отдельными строками работает нормально, все еще глядя на однострочную версию.
честно говоря, я не пробовал это раньше, может быть хорошей идеей в следующий раз
Попробуйте это, чтобы решить проблему:
def CustomOp(d):
return (lambda t:tuple([t[0],t[1]*2])) if all(type(v)==int for v in d.values()) else (lambda t:tuple([t[0],t[1][::-1]])) if all(type(v)==str for v in d.values()) else lambda t:t
Проблема в том, как вещи сгруппированы между утверждениями if
-else
и утверждениями lambda
.
Если вы заключите свои утверждения lambda
в круглые скобки, функция будет работать, как и ожидалось. Ваша логика была хороша. Вы просто не учли приоритет/группировку операторов...
Вау, спасибо, я бы никогда не понял, что это большое спасибо. Я бы хотел, чтобы ваш пост понравился, но у меня нет такой репутации, как кажется. У меня все еще остается вопрос, возможно ли это с менее чем 170 символами в этой чертовой строке.
@NoCodeNoBlunder - я думаю, вы все равно сможете выбрать ответ как лучший ответ.
Возможно, вы сможете получить 170 символов, если объедините проверку типов с чем-то вроде all(type(v) in (int,str) for...)
@NoCodeNoBlunder - Отлично. Если вы опубликуете 170-символьный Q, я тоже могу помочь вам с этим. Или хотя бы попытаться. :)
Вы можете написать
CustomOp
с помощью нескольких строк кода? Я бы попробовал это сначала и только потом попытался сжать это в одну строку.