【问题标题】:Making use of dict.get for if elif and else in List Comprehension在 List Comprehension 中使用 dict.get for if elif 和 else
【发布时间】:2020-04-17 08:07:59
【问题描述】:

我想在列表理解中实现ifelifelse,在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


【解决方案1】:

你想要这样吗?

import numpy as np
perc = np.array([0, 0.25, 0.5, 0.75, 1])
d= {0: 0, len(perc):1}
result = [d.get(x, (lambda y: ((perc[y-1]+perc[y])/2) if y < len(perc) else 99999)(x)) for x in range(len(perc)+8)]
print(result)
#[0, 0.125, 0.375, 0.625, 0.875, 1, 99999, 99999, 99999, 99999, 99999, 99999, 99999]

【讨论】:

  • 是的,效果很好。我应该考虑使用 lambda。傻我。我投了赞成票。我也等其他人回答,看看有没有更优雅的方式或方法;如果没有,我会接受这个作为答案。
猜你喜欢
  • 2017-11-27
  • 2016-05-15
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
相关资源
最近更新 更多