小编典典

Python循环vs理解列表vs映射的副作用(即不使用返回值)

python

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 ListComprehensionVs。将接受的答案说成的地图:

在其他情况下,列表理解可能会更快,并且大多数(并非全部) pythonista用户认为列表更直接,更清晰

但是,对于使用列表推导仅产生副作用是否是Pythonic是公认的答案?说:

这样做 是非常反Python的(
仅将理解列表仅用于副作用,忽略返回值),任何经验丰富的Pythonista都会为您带来麻烦。中间列表在创建后会被丢弃,它可能非常大,因此创建起来很昂贵。

PS:我已经对哪一个是最好的提出了意见,但是我的一位同事不同意。这就是为什么我要问。


阅读 138

收藏
2021-01-20

共1个答案

小编典典

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

for r in res:
    r.update(r.pop('some_key', {}))
  • 具有使用规则for循环的所有优点
  • 很容易理解
  • 只需要两行代码
  • 不需要if子句
2021-01-20