【问题标题】:Python multiprocessing.Pool map() "TypeError: string indices must be integers, not str"Python multiprocessing.Pool map() "TypeError: string indices must be integers, not str"
【发布时间】:2014-03-15 01:16:23
【问题描述】:

我正在尝试使用 multiprocessing.Pool 对字典列表进行并行处理。下面是一个例子

请注意:这是一个玩具示例,我的实际示例将对实际字典中的值进行 cpu 密集型处理)

import multiprocessing

my_list = [{'letter': 'a'}, {'letter': 'b'}, {'letter': 'c'}]

def process_list(list_elements):
    ret_list = []
    for my_dict in list_elements:
        ret_list.append(my_dict['letter'])
    return ret_list

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    letters = pool.map(process_list, my_list)
    print letters

如果我运行上面的代码,我会收到以下错误:

Traceback (most recent call last):
  File "multiprocess_fail.py", line 13, in <module>
    letters = pool.map(process_list, my_list)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 250, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 554, in get
    raise self._value
TypeError: string indices must be integers, not str

我不知道它指的是什么字符串索引。 pool.map 不应该只是迭代my_list 中的项目(即字典)吗?我是否必须更改将数据传递给 map 函数的方式才能使其运行?

【问题讨论】:

  • my_dict'letter' 对于 map 的每次迭代,list_elements 是单个 dict 而不是整个列表

标签: python multiprocessing


【解决方案1】:

pool.map() 接受一个可调用对象和一个可迭代对象,然后继续将可调用对象应用于iterable 中的每个元素。它将工作分块分配给池工作者,但该函数一次只能传递 一个 元素。

您传入了一个字典列表,这意味着每个process_list() 都传递了一个字典:

process_list({'letter': 'a'})
process_list({'letter': 'b'})
# etc.

但是,您的代码将list_elements 视为一个列表。 for 循环:

for my_dict in list_elements:

而是看到字典键,每个my_dict 一次绑定到一个键。对于您的字典,这意味着有一次迭代,并且每次将my_dict 设置为'letter'。行:

my_dict['letter']

然后尝试索引到那个字符串,'letter'['letter'] 抛出你看到的异常。

以下作品:

def process_list(list_element):
    return list_element['letter']

你会返回一个结果; map() 将所有结果收集到一个新列表中,并在所有工作人员完成后返回。

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2012-03-03
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多