在python中,如何将带有list的dictionary转换为每个关联键的值不相等的dictionarylist



我正在尝试转换

data_table = {"Red":[1,2,3], "Blue":[4,5,6]}

data_table = [ {"Red": 1, "Blue": 4 }, {"Red": 2, "Blue": 5}, {"Red": 3, "Blue": 6}] 

一种可能的方法是使用熊猫数据帧。在某些情况下,我们的字典里可能有100多个关键字

import pandas as pd
df =  pd.DataFrame(data_table, index=['row1', 'row2', 'row3'])
print(df.to_dict('records'))

我真正想知道的是data_table中的键是否有不相等的值。在下面的例子中,"黑色"在列表中有2个值,而字典中的所有其他键都有3个与之相关的值。

data_new = {'Red': [1,2,3], 'Blue': [4,5,6], 'Green': [7,8,9], 'Black': [0,10]} 


data_new = [{'Red': 1, 'Blue':4,'Green':7, 'Black':0}, {'Red': 2, 'Blue':5,'Green': 8,'Black': 10}, {'Red': 3, 'Blue': 6, 'Green':9}]

Pandas dataFrame方法失败了,因为它不能广播。

任何可能的方法都是有益的。

进近1(无pandas(

我们可以使用zip_longestitertools压缩字典中的值,然后在列表理解中迭代压缩的值,并为每个压缩的值创建字典理解中的记录

from itertools import zip_longest
[{k:v for k, v in zip(data_new.keys(), vals) if v is not None}
for vals in zip_longest(*data_new.values())]

方法2(使用pandas(

我们可以从给定的字典中创建一个新的数据帧,其方向设置为索引,然后将数据帧堆叠为整形,然后在级别=1上进行分组,并将每个数据帧映射到列表理解中的dict

df = pd.DataFrame.from_dict(data_new, 'index').stack().astype(int)
i = df.index.get_level_values(1)
[dict(g) for _, g in df.droplevel(1).groupby(i)]

结果

[{'Red': 1, 'Blue': 4, 'Green': 7, 'Black': 0},
{'Red': 2, 'Blue': 5, 'Green': 8, 'Black': 10},
{'Red': 3, 'Blue': 6, 'Green': 9}]

您可以使用列表理解

data_table = {"Red":[1,2,3], "Blue":[4,5,6]}
new = [{'Red':r,'Blue':b} for r,b in zip(data_table['Red'],data_table['Blue'])]

输出

[{'Red': 1, 'Blue': 4}, {'Red': 2, 'Blue': 5}, {'Red': 3, 'Blue': 6}]

最新更新