如何在内联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。这些操作都非常快,使用内置和固定大小的对象。


以上是如何在内联for循环中分配变量?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>