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. Map其中接受的答案是:
[...] List comprehensions may be faster in other cases and most (not all) pythonistas consider them more direct and clearer [...].
尽管如此,Is it Pythonic to use list comprehensions for just side effects? 的接受答案说:
It is very anti-Pythonic to do so [use comprehension lists for side effects only, ignoring return value], and any seasoned Pythonista will give you hell over it. The intermediate list is thrown away after it is created, and it could potentially be very, very large, and therefore expensive to create.
PS:我已经对哪一个最好有自己的看法,但我的一位同事不同意。这就是我询问的原因。
最佳答案
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']
这比其他的要好
- 没有生成将被丢弃的不必要的列表
- 适用于 Py 3.x
- 没有显式函数调用开销
5.- 在此处插入您自己的方法
for r in res:
if 'some_key' in r:
r.update(r['some_key'])
del r['some_key']
关于Python 循环 vs 理解列表 vs 映射的副作用(即不使用返回值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14633298/