如何在内联for循环中分配变量?
我有一个我正在使用内联循环循环的列表:
list = [{'information':{'num':1, 'name':'Helen', 'age':28}},
{'information':{'num':2, 'name':'John', 'age':20}},
{'information':{'num':3, 'name':'Jake', 'age':22}}]
所以我想做这样的事情:
loop = [(with person.information as per)
{num:per.num, name:per.name, age=per.age}
for person in mylist]
但它不起作用。有没有办法将person.information对象重命名为每个对象?
我担心的是我不想person.information每次都写。
回答
我有时使用的一个技巧是:
[{'num': per.num, 'name': per.name, 'age': per.age}
for person in mylist for per in [person.information]]
请注意,这不适用于您提供的初始化代码,因为它们是简单dict对象(无点访问器)。但是,例如,如果person.information是 aclass或 a namedtuple,那么您可以按原样使用它。
性能注意事项
如果您担心“假循环”(迭代 1 元素列表的循环),那么通过检查反汇编代码来观察 Python 所做的事情会很有趣。这是一个玩具示例:
import dis
def f0(mylist):
return [
p['foo']['a']
for p in mylist
]
def f1(mylist):
return [
d['a']
for p in mylist
for d in [p['foo']]
]
现在比较以下输出:
>>> dis.dis(f0)
2 0 LOAD_CONST 1 (<code object <listcomp> at 0x7fc886f6d710, file "<ipython-input-28-ebf24f3417d6>", line 2>)
2 LOAD_CONST 2 ('f0.<locals>.<listcomp>')
4 MAKE_FUNCTION 0
4 6 LOAD_FAST 0 (mylist)
2 8 GET_ITER
10 CALL_FUNCTION 1
12 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x7fc886f6d710, file "<ipython-input-28-ebf24f3417d6>", line 2>:
2 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 16 (to 22)
4 6 STORE_FAST 1 (p)
3 8 LOAD_FAST 1 (p)
10 LOAD_CONST 0 ('foo')
12 BINARY_SUBSCR
14 LOAD_CONST 1 ('a')
16 BINARY_SUBSCR
18 LIST_APPEND 2
20 JUMP_ABSOLUTE 4
>> 22 RETURN_VALUE
与f1:
>>> dis.dis(f1)
2 0 LOAD_CONST 1 (<code object <listcomp> at 0x7fc886f6d870, file "<ipython-input-29-73fac11e7b55>", line 2>)
2 LOAD_CONST 2 ('f1.<locals>.<listcomp>')
4 MAKE_FUNCTION 0
4 6 LOAD_FAST 0 (mylist)
2 8 GET_ITER
10 CALL_FUNCTION 1
12 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x7fc886f6d870, file "<ipython-input-29-73fac11e7b55>", line 2>:
2 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 28 (to 34)
4 6 STORE_FAST 1 (p)
5 8 LOAD_FAST 1 (p)
10 LOAD_CONST 0 ('foo')
12 BINARY_SUBSCR
14 BUILD_TUPLE 1
16 GET_ITER
>> 18 FOR_ITER 12 (to 32)
20 STORE_FAST 2 (d)
3 22 LOAD_FAST 2 (d)
24 LOAD_CONST 1 ('a')
26 BINARY_SUBSCR
28 LIST_APPEND 3
30 JUMP_ABSOLUTE 18
>> 32 JUMP_ABSOLUTE 4
>> 34 RETURN_VALUE
如您所见, 的代码f1只有一个BUILD_LIST(如f0)。然而BUILD_TUPLE,有单个元素 ( p['foo']) 的 a GET_ITER,该元组的 a 和 a FOR_ITER。这些操作都非常快,使用内置和固定大小的对象。