Python循环vs理解列表vs映射的副作用(即不使用返回值)
问题内容:
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
ComprehensionVs。将接受的答案说成的地图:
在其他情况下,列表理解可能会更快,并且大多数(并非全部) pythonista用户认为列表更直接,更清晰 。
但是,对于使用列表推导仅产生副作用是否是Pythonic是公认的答案?说:
这样做 是非常反Python的(
仅将理解列表仅用于副作用,忽略返回值),任何经验丰富的Pythonista都会为您带来麻烦。中间列表在创建后会被丢弃,它可能非常大,因此创建起来很昂贵。
PS:我已经对哪一个是最好的提出了意见,但是我的一位同事不同意。这就是为什么我要问。
问题答案:
我认为Abhijit答案的这种变化最好,同时也是我的第4点的变化。
for r in res:
r.update(r.pop('some_key', {}))
- 具有使用规则
for
循环的所有优点 - 很容易理解
- 只需要两行代码
- 不需要
if
子句