2016-01-18 57 views
1

我给了一个指数系数作为多项式的键值对的字典。我的任务是创建一个函数来返回包含导数指数 - 系数键值对的字典。这是我这么远,但它不工作: 如何使用字典理解+ if/else更改词典中的键值?

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} 

为什么我得到语法错误?有人能想出一个很好的补救办法,最好是一个班轮吗?

更新:

感谢卡尔Knechtel的回答可以使这项任务到这个整齐的一个班轮:

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

+1

“else”子句应该表示什么意思? 'else' 0? – gtlambert

+0

如果指数(d [i])是0(x^0 = 1),这意味着d [i]是一个常数,那么它的导数就是0,因此d [i]:0 – Thomas

+0

你的意思是,如果'i '不是0,那么'd = {i - 1:i * d [i]}'。否则,'d = {d [i]:0}'?然而,在这种情况下,假设'i'为0.因为你的'if..else'工作在:Python,所以你认为你的意思是:'d = {i - 1:d [i]:0 for i in d} '我* d [我]如果我不是0其他d [i]'。 –

回答

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}(这里我已经写了“系数” e为“指数”和c)。

+0

非常感谢,这是真正有用的信息和清理事情,也是最好的答案! – Thomas

2

试试这个:

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

这只是删除不变(即零指数),因为它的导数为零。

+0

是的,这正是我正在寻找的,来想一想。我不需要0键的衍生物:) – Thomas