什么时候应该使用生成器表达式?什么时候应该在Python中使用列表推导?
# Generator expression
(x*2 for x in range(256))
# List comprehension
[x*2 for x in range(256)]
Run Code Online (Sandbox Code Playgroud) 我正在运行一段代码,意外地在程序的某个部分出现了逻辑错误.在调查该部分时,我创建了一个测试文件来测试正在运行的语句集,并发现一个看起来非常奇怪的异常错误.
我测试了这个简单的代码:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
array = [5, 6, 1, 2, 9] # Updates original to something else
print(list(f)) # Outputs filtered
Run Code Online (Sandbox Code Playgroud)
输出是:
>>> []
Run Code Online (Sandbox Code Playgroud)
是的,没什么.我期待过滤器理解能够在数组中获取数量为2的项并输出它,但我没有得到:
# Expected output
>>> [2, 2]
Run Code Online (Sandbox Code Playgroud)
当我评论第三行再次测试时:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
### array …Run Code Online (Sandbox Code Playgroud) 当使用列表理解与生成器理解时,我得到不同的输出.这是预期的行为还是一个错误?
请考虑以下设置:
all_configs = [
{'a': 1, 'b':3},
{'a': 2, 'b':2}
]
unique_keys = ['a','b']
Run Code Online (Sandbox Code Playgroud)
如果我然后运行以下代码,我得到:
print(list(zip(*( [c[k] for k in unique_keys] for c in all_configs))))
>>> [(1, 2), (3, 2)]
# note the ( vs [
print(list(zip(*( (c[k] for k in unique_keys) for c in all_configs))))
>>> [(2, 2), (2, 2)]
Run Code Online (Sandbox Code Playgroud)
这是在python 3.6.0上:
Python 3.6.0 (default, Dec 24 2016, 08:01:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Run Code Online (Sandbox Code Playgroud)