【问题标题】:Trouble with generator object not casting to list being returned from map function生成器对象不转换为从映射函数返回的列表的问题
【发布时间】:2020-12-07 00:47:23
【问题描述】:

我在尝试将字典返回给调用者并将返回的生成器转换为列表时遇到问题,但是当我打印 event_list 时,它仍然声明它是生成器对象。

我的目标是通过文件列表对函数进行多处理,这将创建一个本地字典并将所述字典返回给调用者,以便我可以创建一个包含从该方法返回的字典的单个列表。不完全确定我哪里出错了。

import multiprocessing as mp
import json

class Events(object):
    def __init__(self):
        self._parse_events()

    def _parse_events(self):
        my_list = ['file1', 'file2', 'file3']
        event_results = list()

        with mp.Pool() as pool:
            results = list(pool.map(self._get_event, my_list))

        for result in results:
            event_results.append(result)

        print(event_results) # <------- this somehow returns a generator although I thought i casted the return to a list

        print(sum(event_results, [])) # <--------- this doesn't work now that im dealing with a generator rather than the original list


    def _get_event(self, filename):
        key_identifier = 'role'

        with open(filename, 'r') as data:
            for line in data:
                if key_identifier in line:
                    temp_dict = dict()
                    try:
                        contents = json.loads(line)
                        temp_dict['UTC'] = contents.get('utc', 'None')
                        temp_dict['ServiceID'] = contents[key_identifier].get('ServiceID', 'None')
                    except (KeyError, ValueError):
                        continue

                    if temp_dict: yield temp_dict

【问题讨论】:

  • 我不明白event_results 怎么可能是生成器。无论如何,_get_event() 不应该返回 event_list(无论如何都是空的),因为它是一个生成器函数 - 它应该允许在 with 完成后结束。
  • @martineau 同意您的最后一句话,即当我附加到列表而不是屈服时,返回是遗留下来的。我将编辑帖子。

标签: python generator


【解决方案1】:

您的代码正在创建一个生成器列表。不是顶级对象的类型不正确,而是内部值,而您根本没有强制转换这些值。您可能打算这样做,因为您目前有一个几乎毫无意义的额外循环,您将生成器对象从 results 移动到 event_results 而不对它们做任何其他事情。

您可以更改该循环以将内部值放入列表中:

for result in results:
    event_results.extend(result) # extend consumes an iterable

或者,如果您想要一个列表列表,而不是一个单一的平面列表,您可以这样做:

for result in results:
    event_results.append(list(result)) # convert each generator into a list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2011-04-23
    • 1970-01-01
    • 2021-11-24
    • 2022-08-15
    相关资源
    最近更新 更多