如何使用字典理解+ if/else更改字典中的键值?

How to change key-value in dictionary using dictionary comprehension + if/else?

我得到了一个字典,其中指数系数作为多项式的键值对。我的任务是创建一个函数 return 一个包含导数指数-系数键值对的字典。这是我到目前为止所得到的,但它不起作用:

def diff_p(d):
    d = {i - 1: i*d[i] if i is not 0 else d[i]: 0 for i in d}
    return d

p = {0: -3, 3: 2, 5: -1}

为什么会出现语法错误?谁能想出一个好的补救措施,最好是单眼皮?

更新:

感谢 Karl Knechtel 的回答,我们可以将此任务变成一个简洁的衬里:

deff_p = lambda d: {e - 1: c*e for e, c in d.items() if e != 0}

试试这个:

def diff_p(d):
    d = {i-1: i*d[i] for i in d if i != 0}
    return d

这只是删除了常数项(即零指数),因为它的导数是零。

i - 1: i*d[i] if i is not 0 else d[i]: 0

问题是您在表达式中将 i - 1: i*d[i]d[i]: 0 视为单个 "terms"。他们不是。您需要为键和值使用单独的条件逻辑。

此外,您应该使用 ==!= 进行数值比较,而不是 isis not

所以这会给你 {(i - 1 if i != 0 else d[i]): (i*d[i] if i != 0 else 0) for i in d}。 (它应该没有括号,但我认为那样阅读真的很难。)

就是说,假设您的字典表示多项式的系数,并且该函数执行微分,我不明白您为什么要输入这个奇怪的 special-cased 项。当你区分时,多项式的常数项应该完全消失;因此,自然逻辑是将其完全过滤掉,例如:{i - 1: i*d[i] for i in d if i != 0}.

最后,通常认为直接遍历字典的 key-value 对 ("items") 更干净:{e - 1: c * e for e, c in d.items() if e != 0}(这里我写了 e for "exponent" 和 c 对于 "coefficient").