【发布时间】:2020-04-17 08:07:59
【问题描述】:
我想在列表理解中实现ifelif 和else,在this stackoverflow 答案中我找到了一种方法。
那么让我解释一下问题所在:
根据答案,dict.get() 可以通过以下方式在列表理解中使用条件:
>>> l = [1, 2, 3, 4, 5]
>>> d = {1: 'yes', 2: 'no'}
>>> [d.get(x, 'idle') for x in l]
['yes', 'no', 'idle', 'idle', 'idle']
看起来不错。但我遇到了另一种问题。 所以我需要使用相同的方法来处理其他列表的索引。请允许我解释一下:
perc = np.array([0, 0.25, 0.5, 0.75, 1])
d= {0: 0, len(perc):1}
result = [d.get(x, (perc[x-1]+perc[x])/2) for x in range(len(perc)+1)]
所以简而言之,我希望我的输出是 0 和 1,因为 x 是 0 和 len(perc),或者是先前值和当前值的平均值。
现在,这给了我一个错误:
IndexError: index 5 is out of bounds for axis 0 with size 5
我的问题是,dict.get(key[, default])定义为:
如果键在字典中,则返回键的值,否则返回默认值。如果未给出默认值,则默认为无,因此此方法永远不会引发
KeyError。
现在显然 5 作为键在字典中为 len(perc)=5,那么为什么首先检查默认条件,这显然会给出错误,因为数组 perc 中没有 5th 索引。
编辑
正如Klaus 的评论中所提到的,表达式在调用 .get() 之前被评估。如果是这种情况并且对此无能为力,那么有没有其他方法可以在不使用循环的情况下实现这一目标?
【问题讨论】:
-
错误不是通过访问字典键而是通过访问数组引发的。 5 项数组中没有索引
5。 -
嘿克劳斯,我已经在我的问题中提到过,它正在访问数组中的第 5 个索引。我的问题是,根据 dict.get() 的定义,它不应该首先检查字典,其中 5 作为键已经存在。因为在这种情况下,它不需要检查默认值。
-
在调用
.get()之前计算表达式。 -
这样的话,是不是docs.python中定义的方式不对?它说:如果键在字典中,则返回键的值,否则默认。
-
不,它是正确的。默认值为 求值 表达式的 result。
标签: python dictionary if-statement conditional-statements list-comprehension