首页 > 解决方案 > Python 字典操作

问题描述

我正在解决一个问题,我想将 python dict 与列表作为值如下所示

[
    {'a': [1,2,3,4], 'b':[0,9,8], 'c': 'row1'},
    {'x': [1,2,3,4], 'y':[0,9,8], 'z': 'row2'}
]

类似于

[
    {'a':1, 'b': 0, 'c': 'row1'},
    {'a':1, 'b': 9, 'c': 'row1'},
    {'a':1, 'b': 8, 'c': 'row1'},
    {'a':2, 'b': 0, 'c': 'row1'},
    {'a':2, 'b': 9, 'c': 'row1'},
    {'a':2, 'b': 8, 'c': 'row1'},
    {'a':3, 'b': 0, 'c': 'row1'},
    {'a':3, 'b': 9, 'c': 'row1'},
    {'a':3, 'b': 8, 'c': 'row1'},
    {'a':4, 'b': 0, 'c': 'row1'},
    {'a':4, 'b': 9, 'c': 'row1'},
    {'a':4, 'b': 8, 'c': 'row1'},
    {'x':1, 'y': 0, 'z': 'row2'},
    {'x':1, 'y': 9, 'z': 'row2'},
    {'x':1, 'y': 8, 'z': 'row2'},
    {'x':2, 'y': 0, 'z': 'row2'},
    {'x':2, 'y': 9, 'z': 'row2'},
    {'x':2, 'y': 8, 'z': 'row2'},
    {'x':3, 'y': 0, 'z': 'row2'},
    {'x':3, 'y': 9, 'z': 'row2'},
    {'x':3, 'y': 8, 'z': 'row2'},
    {'x':4, 'y': 0, 'z': 'row2'},
    {'x':4, 'y': 9, 'z': 'row2'},
    {'x':4, 'y': 8, 'z': 'row2'},
]

我曾尝试使用 pandas 来压平 dict,但没有什么建设性的结果。有点卡住试图找出替代方案

标签: pythonpython-3.x

解决方案


您可以使用itertools.product在 dict 项目上生成笛卡尔积(给定变量中的输入列表l):

from itertools import product
[dict(p) for d in l for p in product(*([(k, i) for i in v] if isinstance(v, list) else [(k, v)] for k, v in d.items()))]

这将返回:

[{'a': 1, 'b': 0, 'c': 'row1'},
 {'a': 1, 'b': 9, 'c': 'row1'},
 {'a': 1, 'b': 8, 'c': 'row1'},
 {'a': 2, 'b': 0, 'c': 'row1'},
 {'a': 2, 'b': 9, 'c': 'row1'},
 {'a': 2, 'b': 8, 'c': 'row1'},
 {'a': 3, 'b': 0, 'c': 'row1'},
 {'a': 3, 'b': 9, 'c': 'row1'},
 {'a': 3, 'b': 8, 'c': 'row1'},
 {'a': 4, 'b': 0, 'c': 'row1'},
 {'a': 4, 'b': 9, 'c': 'row1'},
 {'a': 4, 'b': 8, 'c': 'row1'},
 {'x': 1, 'y': 0, 'z': 'row2'},
 {'x': 1, 'y': 9, 'z': 'row2'},
 {'x': 1, 'y': 8, 'z': 'row2'},
 {'x': 2, 'y': 0, 'z': 'row2'},
 {'x': 2, 'y': 9, 'z': 'row2'},
 {'x': 2, 'y': 8, 'z': 'row2'},
 {'x': 3, 'y': 0, 'z': 'row2'},
 {'x': 3, 'y': 9, 'z': 'row2'},
 {'x': 3, 'y': 8, 'z': 'row2'},
 {'x': 4, 'y': 0, 'z': 'row2'},
 {'x': 4, 'y': 9, 'z': 'row2'},
 {'x': 4, 'y': 8, 'z': 'row2'}]

推荐阅读