python 包含和不包含子循环的列表理解
python list comprehension with and without sub loops
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
为真时设置 val
,这仅在 i == 3
为真时发生。因此,当 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) 操作)测试 4
和 3
,然后完全退出循环。
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
为真时设置 val
,这仅在 i == 3
为真时发生。因此,当 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) 操作)测试 4
和 3
,然后完全退出循环。