【发布时间】:2014-09-20 13:54:25
【问题描述】:
我正在处理一组frozensets。我正在尝试为字典“输出”中的每个冻结集找到最小集。我有 70k freezesets,所以我正在制作这个frozenset 字典并并行化这个任务。当我尝试将此字典作为输入传递给我的函数时,只发送密钥,所以我收到错误,有人可以帮我找出问题所在。
output => {frozenset({'rfid', 'zone'}): 0, frozenset({'zone'}): 0, frozenset({'zone', 'time'}): 0}
def reduce(prob,result,output):
print(output)
for k in output.keys():
#Function to do something
def reducer(prob,result,output):
print(output)
p = Pool(4) #number of processes = number of CPUs
func2 = partial(reduce,prob,result)
reduced_values= p.map( func2,output,chunksize=4)
p.close() # no more tasks
p.join() # wrap up current tasks
return reduced_values
if __name__ == '__main__':
final = reducer(prob,result,output)
{frozenset({'rfid', 'zone'}): 0, frozenset({'zone'}): 0, frozenset({'zone', 'time'}): 0}
frozenset({'rfid', 'zone'})
Error : AttributeError: 'frozenset' object has no attribute 'keys'
已按要求更新
from multiprocessing import Pool
from functools import partial
import itertools
output = {frozenset({'rfid', 'zone'}): 0, frozenset({'zone'}): 0, frozenset({'zone', 'time'}): 0}
prob = {'3': 0.3, '1': 0.15, '2': 0.5, '4': 0.05}
result = {'2': {frozenset({'time', 'zone'}), frozenset({'time', 'rfid'})}, '3': {frozenset({'time', 'rfid'}), frozenset({'rfid', 'zone'})}}
def reduce(prob,result,output):
print(output)
for k in output.keys():
for ky,values in result.items():
if any(k>=l for l in values):
output[k] += sum((j for i,j in prob.items() if i == ky))
return output
def reducer(prob,result,output):
print(output)
p = Pool(4) #number of processes = number of CPUs
func2 = partial(reduce,prob,result)
reduced_values= p.map( func2,output,chunksize=4)
p.close() # no more tasks
p.join() # wrap up current tasks
return reduced_values
if __name__ == '__main__':
final = reducer(prob,result,output)
{frozenset({'zone', 'rfid'}): 0, frozenset({'zone'}): 0, frozenset({'time', 'zone'}): 0}
for k in output.keys():
AttributeError: 'frozenset' object has no attribute 'keys'
frozenset({'zone', 'rfid'})
来自控制台的完整错误详情:
{frozenset({'zone', 'time'}): 0, frozenset({'zone', 'rfid'}): 0, frozenset({'zone'}): 0}
frozenset({'zone', 'time'})
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "F:\Python34\lib\multiprocessing\pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "F:\Python34\lib\multiprocessing\pool.py", line 44, in mapstar
return list(map(*args))
File "C:\Users\Dell\workspace\key_mining\src\variable.py", line 16, in reduce
for k in output.keys():
AttributeError: 'frozenset' object has no attribute 'keys'
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\***\variable.py", line 33, in <module>
final = reducer(prob,result,output)
File "C:\***\variable.py", line 27, in reducer
reduced_values= p.map( func2,output,chunksize=4)
File "F:\Python34\lib\multiprocessing\pool.py", line 260, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "F:\Python34\lib\multiprocessing\pool.py", line 599, in get
raise self._value
AttributeError: 'frozenset' object has no attribute 'keys'
【问题讨论】:
-
当您将
p.map应用于字典时,它会将其视为列表,因此会像 for 循环一样遍历键。你想把它传递给output.items()并对每个元组做点什么吗? -
我想要整个字典输出 => {frozenset({'rfid', 'zone'}): 0, freezeset({'zone'}): 0, frozenset({'zone', 'time'}): 0} 在该函数内,然后我想迭代每个键值。但是我的疑问是,当我尝试在该函数中打印输出时,我得到的只是这个 frozenset({'rfid', 'zone'}) ,而不是 freezeset({'rfid', 'zone'}): 0。就是这样问题出在哪里.. :(
-
@Jeeva 请检查您的
output变量在哪里更改为output.keys()。这就是错误。不知何故,您的输出变量在传递给函数之前发生了变化。 -
更新了完整代码..请检查
-
@Jeeva traceback 仍然缺少您在控制台中获得的内容。请复制过去您在控制台中获得的内容而不进行编辑。
标签: python python-3.x dictionary