Python生成器在附加到lis时创建yield结果的副本

2024-04-23 21:14:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我的生成器函数“returns”/生成我想要的结果(打印时),但是如果我将结果附加到一个大列表中,那么列表中会有许多重复的结果。为什么?我怎样才能避免这种情况?在

输入:

input = [
[
    {'orgunit': '013107','attr1': 2, 'attr2': 3},
    {'orgunit': '013113','attr1': 20, 'attr3': 30},
],
    [{...}]
]

其中,输入共享公共orgunits的dicts。 如果我打印isolated

目标(但将每个元素追加到列表中):

^{pr2}$

方法和生成器:

def transform(input):
    values = []
    gen = process_event(input)
    for event in gen:
        values.append(event)
    # print
    print values

def process_event(input):
    for i in xrange(len(input)):
        for event in input[i]:
            isolated = {}
            isolated['orgunit'] = event['orgunit']
            for key, value in event.copy().iteritems():
                isolated['dataElement'] = key
                isolated['value'] = value
                # print
                print isolated
                yield isolated

我得到的是:

>>>print values
    {
        "dataElement": "attr1", 
        "value": 2, 
        "orgunit": "013107"
    }, 
    {
        "dataElement": "attr1", 
        "value": 2, 
        "orgunit": "013107"
    }...

Tags: inevent列表forinputvaluedefprocess
1条回答
网友
1楼 · 发布于 2024-04-23 21:14:23

似乎您修改了相同的字典,因此第一个和第二个输出返回的项在引用的意义上是相同的。简单的解决方案是在更深的范围内创建新的隔离字典,而不是在它之外。

因此,您的代码正确版本是:

def process_event(input):
    for events_list in input:  # It's more pythonic way to iterate over items, not by indices
        for event in events_list:
            orgunit = event['orgunit'] # Save current orgunit
            del event['orgunit'] # You will get "dataElement: orgunit" without this. Also you can make a copy and delete from a copy to do not corrupt input list
            for key, value in event.iteritems(): # You do not need copy here
                isolated = {'orgunit': orgunit} # The main point - each time create new isolated dict
                isolated['dataElement'] = key
                isolated['value'] = value
                # print
                print isolated
                yield isolated

输出:

^{pr2}$

相关问题 更多 >