Как я могу использовать карту для возврата измененного словаря на основе условий в одной строке кода?

Привет, я должен написать функцию CustomOp(d), которая принимает dict d и используется следующим образом:

dict(map(CustomOp(d), d.items()))

Предполагается, что функция помогает изменять значения dicts на основе следующих условий:

  1. Если dict содержит только целые числа: удвойте каждое значение.
  2. Если он содержит только строки: переверните каждую строку.
  3. Если dict содержит другие типы или несколько разных типов: вернуть неизмененный dict

Кроме того, функция 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 в последовательность

Я понятия не имею, как заставить эту линию работать и как можно сделать ее короче, и после значительного количества времени я решил сдаться и попросить вас, ребята.

Вы можете написать CustomOp с помощью нескольких строк кода? Я бы попробовал это сначала и только потом попытался сжать это в одну строку.

mkrieger1 24.12.2020 17:43

И можете ли вы сделать 1. 2. и 3. по отдельности? Я бы тоже сначала попробовал.

mkrieger1 24.12.2020 17:46

запуск вашего кода с отдельными строками работает нормально, все еще глядя на однострочную версию.

GrimTrigger 24.12.2020 17:54

честно говоря, я не пробовал это раньше, может быть хорошей идеей в следующий раз

NoCodeNoBlunder 24.12.2020 18:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте это, чтобы решить проблему:

    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 24.12.2020 18:12

@NoCodeNoBlunder - я думаю, вы все равно сможете выбрать ответ как лучший ответ.

GaryMBloom 24.12.2020 18:33

Возможно, вы сможете получить 170 символов, если объедините проверку типов с чем-то вроде all(type(v) in (int,str) for...)

GaryMBloom 24.12.2020 18:37

@NoCodeNoBlunder - Отлично. Если вы опубликуете 170-символьный Q, я тоже могу помочь вам с этим. Или хотя бы попытаться. :)

GaryMBloom 24.12.2020 18:38

Другие вопросы по теме