我有如下的python代码:
import numpy as np
import multiprocessing as mp
def func(first, sec):
results = []
for x in range(first):
result_dict = {"a": x, "b": x**sec, "c": x/sec}
results.append(result_dict.copy())
return results
with mp.Pool(mp.cpu_count()) as pool:
res = pool.starmap(func, [(a, 8) for a in range(1, 4)])
然后用这段代码将res
压平:
res = np.asarray(res)
res = res.reshape(-1)
res = np.array(res).tolist()
之后,当我打印res
时,输出如下:
[[{'a': 0, 'b': 0, 'c': 0.0}],
[{'a': 0, 'b': 0, 'c': 0.0}, {'a': 1, 'b': 1, 'c': 0.125}],
[{'a': 0, 'b': 0, 'c': 0.0},
{'a': 1, 'b': 1, 'c': 0.125},
{'a': 2, 'b': 256, 'c': 0.25}]]
但是我希望输出是这样的:
[{'a': 0, 'b': 0, 'c': 0.0},
{'a': 0, 'b': 0, 'c': 0.0},
{'a': 1, 'b': 1, 'c': 0.125},
{'a': 0, 'b': 0, 'c': 0.0},
{'a': 1, 'b': 1, 'c': 0.125},
{'a': 2, 'b': 256, 'c': 0.25}]
您是否知道如何更改代码以获得res
的期望结果?
答案 0 :(得分:3)
通过chain.from_iterable
of itertools
library,您可以将子列表链接到一个列表。
import itertools
res = [[{'a': 0, 'b': 0, 'c': 0.0}],
[{'a': 0, 'b': 0, 'c': 0.0}, {'a': 1, 'b': 1, 'c': 0.125}],
[{'a': 0, 'b': 0, 'c': 0.0},
{'a': 1, 'b': 1, 'c': 0.125},
{'a': 2, 'b': 256, 'c': 0.25}]]
print(list(itertools.chain.from_iterable(res)))
答案 1 :(得分:1)
在您的示例中,您将字典存储在列表列表中,列表推导也有效:
res = [[{'a': 0, 'b': 0, 'c': 0.0}],
[{'a': 0, 'b': 0, 'c': 0.0}, {'a': 1, 'b': 1, 'c': 0.125}],
[{'a': 0, 'b': 0, 'c': 0.0},
{'a': 1, 'b': 1, 'c': 0.125},
{'a': 2, 'b': 256, 'c': 0.25}]]
flat_res = [item for items in res for item in items]
print(flat_res)
# [{'a': 0, 'b': 0, 'c': 0.0}, {'a': 0, 'b': 0, 'c': 0.0}, {'a': 1, 'b': 1, 'c': 0.125}, {'a': 0, 'b': 0, 'c': 0.0}, {'a': 1, 'b': 1, 'c': 0.125}, {'a': 2, 'b': 256, 'c': 0.25}]