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


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]

愿我知道我在这里错过了什么

你重新绑定val range()的每次迭代,而你的第一个循环不会这样做。第一个嵌套循环仅在key == i为 true 时设置 val,这仅在 i == 3 为 true 时发生。因此,vali == 3时设置正确,在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,然后完全退出循环。

最新更新