python list comprehension有和没有子循环

时间:2016-01-14 14:03:51

标签: 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]

我可以知道我在这里想念的吗

1 个答案:

答案 0 :(得分:3)

你重新val range()的每次迭代,而你的第一个循环不会这样做。当val为真时,您的第一个嵌套循环仅设置key == i,这仅在i == 3为真时发生。因此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) ,然后测试密钥是否在字典,而不是遍历字典中的所有项目:

4

这只使用成员资格测试(O(1)操作)测试3<script type="text/javascript"> var defDate = @ViewBag.EndDate; if (defDate == null) { $('#dt2').datetimepicker({ locale: 'en-GB', format: 'L', showClear: true }); } else { $('#dt2').datetimepicker({ defaultDate: defDate, locale: 'en-GB', format: 'L', showClear: true }); } </script> ,然后完全退出循环。