【发布时间】:2019-04-10 22:45:30
【问题描述】:
我可以使用产生两个值的生成器:
def get_document_values():
docs = query_database() # returns a cursor to database documents
for doc in docs:
# doc is a dictionary with ,say, {'x': 1, 'y': 99}
yield doc['x'], doc['y']
我有另一个函数process_x,我无法更改它可以将生成器作为输入来处理所有文档的所有x(如果产生了一个元组,那么它只处理元组并忽略其他元素):
X = process_x(get_document_values()) # This processes x but ignores y
但是,我还需要存储来自生成器的所有 y 值。我唯一的解决方案是执行两次get_document_values:
Y = [y for x,y in get_document_values()] #Throw away x
X = process_x(get_document_values()) #Throw away y
这在技术上是可行的,但是当有很多文档要处理时,可能会在数据库中插入一个新文档,并且X 和Y 的长度会有所不同。 X 和 Y 之间需要一对一的映射,我只想调用一次 get_document_values 而不是两次。
我考虑过类似的事情:
Y = []
def process_y(doc_generator):
global Y
for x,y in doc_generator:
Y.append(y)
yield x
X = process_x(process_y(get_document_values()))
但是:
- 这感觉不像蟒蛇
-
Y需要声明为全局变量
我希望有一种更简洁、更 Pythonic 的方式来做到这一点。
更新
实际上,get_document_values 将返回 x 的值,这些值太大而无法集中存储到内存中,process_x 实际上正在减少内存需求。所以,不可能缓存所有的x。不过,缓存所有 y 没问题。
【问题讨论】:
标签: python python-3.x generator