带子循环和不带子循环的python列表理解

标签 python python-2.7 list-comprehension

d = {3: 21, 30: 200, 300: 2000}

如果我这样做,

for i in range(1, 5):
    for key, value in d.iteritems():
        if key == i:
            val = value

我得到了正确的值。但是,如果我将其更改为列表理解方式,我会得到空的“val”

for i in range(1, 5):
    val = [value for key, value in d.iteritems() if key == i]

我想知道我在这里想念什么吗

最佳答案

您在 range() 的每次迭代中重新绑定(bind) val,而您的第一个循环不会执行此操作。您的第一个嵌套循环仅在 key == i 为 true 时设置 val,这仅在 i == 3 为 true 时发生。因此,当 i == 3 时,val 被正确设置,而当 i == 4 时,完全保持不变循环,而您第二次尝试使用列表理解会破坏 val = [21] 结果与 val = []

扩展val每个循环:

for i in range(1, 5):
    val.extend(value for key, value in d.iteritems() if key == i)

或者更好的是,只运行一个列表理解:

val = [value for i in range(1, 5) for key, value in d.iteritems() if key == i]

演示:

>>> [value for i in range(1, 5) for key, value in d.iteritems() if key == i]
[21]

如果您要查找的只是字典中关键的最后一个 i 的值,请反转范围,将 next() 与生成器表达式一起使用,并只测试键是否在字典中,而不是循环字典中的所有项目:

val = next(d[i] for i in range(4, 0, -1) if i in d)

这只会使用成员资格测试(O(1) 操作)来测试 43,然后完全退出循环。

关于带子循环和不带子循环的python列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34791543/

相关文章:

javascript - 如何在 Django View 执行时停止它?

python - 从 MultiIndex 中选择特定级别的数据

haskell - 简单函数中的类型混淆

Python 字典理解与嵌套 for

python - 使用列表理解创建升序和降序数字的一般列表

python - 用于 Mac 开发的 PyObjc 与 RubyCocoa : Which is more mature?

Python二维数组——改变一个元素

python - 在python中读取json输出

python - 对于这个递归代码,为什么 Python 2.7 不会给出堆栈溢出错误,而 3.5 会?

python - 当需要其他变量时如何解包元组?