2

TL; DR 哪个是最好的?

1.- [r.update(r.pop('some_key')) for r in res if r.get('some_key')]

2.- map(lambda r: r.update(r.pop('some_key') if r.get('some_key') else []), res)

3.- map(lambda r: r.update(r.pop('some_key')), filter(lambda r: r.get('some_key'), res))

4.- for r in res:
        if r.get('some_key'):
            for element in r['some_key']:
                r[element] = r['some_key'][element]
            del r['some_key']

5.- Insert your own approach here

注意:这不是生产代码。它是在测试套件中运行的代码,所以我更关心易读性/可维护性而不是性能。尽管如此,我也想知道如果这是生产代码,关于哪个更好(考虑权衡性能/易读性)的决定是否会改变。如果这会产生影响,那么元素“some_key”的数量会非常少。

上下文:我读过Python List Comprehension Vs。接受答案的地图:

[...] 在其他情况下,列表理解可能更快,并且大多数(不是全部)pythonistas 认为它​​们更直接和更清晰[...]。

尽管如此,接受的答案是 Pythonic to use list comprehensions for just side effects?说:

这样做是非常反 Python 的[仅对副作用使用理解列表,忽略返回值],任何经验丰富的 Pythonista 都会让你大吃一惊。中间列表在创建后被丢弃,它可能非常非常大,因此创建成本很高。

PS:我已经对哪个最好有意见,但我的一位同事不同意。这就是我询问的原因。

4

2 回答 2

2
1.- [r.update(r.pop('some_key')) for r in res if r.get('some_key')]

不建议对副作用进行列表理解。它创建一个列表,该列表在操作结束时被丢弃

2.- map(lambda r: r.update(r.pop('some_key') if r.get('some_key') else []), res)

与此没有太大区别1,这将在 Py 3.X 中中断。

3.- map(lambda r: r.update(r.pop('some_key')), filter(lambda r: r.get('some_key'), res))

更糟糕的是3。除了使用map和依赖副作用之外,您还增加了函数调用的开销

4.- for r in res:
        if r.get('some_key'):
            for element in r['some_key']:
                r[element] = r['some_key'][element]
            del r['some_key']

这比其他的好

  1. 没有生成将被丢弃的不必要列表
  2. 将在 Py 3.x 中工作
  3. 没有显式的函数调用开销

5.- 在此处插入您自己的方法

    for r in res:
        if 'some_key' in r:
            r.update(r['some_key'])
            del r['some_key']
于 2013-01-31T19:15:08.193 回答
2

我认为 Abhijit 答案的这种变体,同时也是我的第 4 点的变体是最好的。

for r in res:
    r.update(r.pop('some_key', {}))
  • 具有使用常规for循环的所有优点
  • 很容易理解
  • 只需 2 行代码
  • 不需要if子句
于 2013-02-04T19:10:34.223 回答