【问题标题】:how to convert dictionary with list to list of dictionary with unequal no of values for each associated keys in python?python - 如何将带有列表的字典转换为python中每个关联键的值不相等的字典列表?
【发布时间】:2021-05-12 13:39:48
【问题描述】:

我正在尝试转换

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

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

一种可能的方法是使用 pandas 数据框。在某些情况下,我们的字典中有超过 100 个键。

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

我真正想知道data_table 中的键是否具有不相等的值。在以下示例中,“Black”在列表中有 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 方法因无法广播而失败。

任何可能的方法都会有所帮助。

【问题讨论】:

    标签: python python-3.x pandas dataframe dictionary


    【解决方案1】:

    方法1(没有pandas

    我们可以使用来自itertoolszip_longest 压缩字典中的值,然后在列表推导式中迭代压缩后的值,并为每个压缩后的值在字典推导式中创建记录

    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

    我们可以创建一个新的数据框,其方向设置为来自给定字典的索引,然后堆叠数据框以重塑形状,然后在 level=1 上进行 groupby 并将每个数据框映射到列表理解中的 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}]
    

    【讨论】:

      【解决方案2】:

      你可以使用列表推导

      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}]
      

      【讨论】:

      • 谢谢@BuddyBob! , 但是如果字典很大怎么办呢??
      • 好像有多个键?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2021-12-09
      • 2012-07-12
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多