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

时间:2016-01-18 14:23:24

标签: python dictionary derivative polynomials

我给出了一个带有指数的字典 - 系数作为多项式的键值对。我的任务是创建一个函数来返回包含派生指数 - 系数键 - 值对的字典。这是我到目前为止所得到的,但它不起作用:

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}

2 个答案:

答案 0 :(得分:2)

试试这个:

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

这简单地删除了常数项(即零指数),因为它的导数为零。

答案 1 :(得分:1)

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

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

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

这样会给你{(i - 1 if i != 0 else d[i]): (i*d[i] if i != 0 else 0) for i in d}。 (它应该在没有括号的情况下工作,但我认为这样很难读。)

那就是说,鉴于你的字典代表多项式的系数,并且函数执行区分,我无法理解你为什么要加入这个奇怪的特殊术语。当你区分时,多项式的常数项应该完全消失;因此,自然逻辑是完全过滤掉的,例如:{i - 1: i*d[i] for i in d if i != 0}

最后,通常认为直接迭代字典的键值对(“项目”)是更清晰的:{e - 1: c * e for e, c in d.items() if e != 0}(这里我为{exponent}和{{1写了e对于“系数”)。