【问题标题】:Convert 4 one-to-one mapped lists into a list of dicts (python)将 4 个一对一映射列表转换为字典列表(python)
【发布时间】:2018-06-05 10:19:00
【问题描述】:

我有 4 个列表,其中的元素是一对一映射的。有数以万计的元素。我想创建一个字典,为每个元素提供 4 个属性,然后我想将这些字典放入一个列表中。 (我的最终目标是创建一个 pandas DataFrame 并将其保存为 HDF5 文件。)

有没有一种简单的节省内存的方法来做到这一点,也许使用 zip() 和 dict() 而不是 for 循环?

作为 Python 的工作示例,请考虑:

list1 = ['obj1','obj2','obj3']
list2 = ['cat','dog','tree']
list3 = [7,8,9]
list4 = ['red','green','blue']

所以我的想法是最后我想要一个 dicts 列表,看起来像

[{'obj':'obj1','type':'cat','num':7,'color':'red'}, 
 {'obj':'obj2','type':'dog','num':8,'color':'green'}, 
 {'obj':'obj3','type':'tree','num':9,'color':'blue'}]

【问题讨论】:

    标签: python pandas numpy dictionary dataframe


    【解决方案1】:

    由于它使用每个列表中的对应元素(输出列表的第一个字典与每个输入列表中的第一个元素)并假设所有列表的大小相同,使用list comprehension 可能是另一种方式:

    [{'obj':list1[i], 'type':list2[i], 
      'num':list3[i], 'color':list4[i]} for i in range(len(list1))]
    

    【讨论】:

      【解决方案2】:

      这是一个非熊猫选项:

      data = zip(list1, list2, list3, list4)
      keys = ['obj', 'type', 'num', 'color']
      list_of_dicts = [dict(zip(keys, i)) for i in data]
      

      【讨论】:

      • 我应该好好学习一下我的复制和粘贴技巧,并实际复制预期的行。
      【解决方案3】:

      而不是列表dictdicts

      import pandas as pd
      import numpy as np
      list1 = ['obj1','obj2','obj3']
      list2 = ['cat','dog','tree']
      list3 = [7,8,9]
      list4 = ['red','green','blue']
      pd.DataFrame(np.array([list1, list2, list3, list4])).to_dict()
      

      【讨论】:

        【解决方案4】:

        既然你标记了pandas,通过使用to_dict

        pd.DataFrame({'obj':list1,'type':list2,'num':list3,'color':list4}).to_dict('r')
        Out[1204]: 
        [{'color': 'red', 'num': 7, 'obj': 'obj1', 'type': 'cat'},
         {'color': 'green', 'num': 8, 'obj': 'obj2', 'type': 'dog'},
         {'color': 'blue', 'num': 9, 'obj': 'obj3', 'type': 'tree'}]
        

        【讨论】:

        • df 根据问题的最终目标:)
        • @quantumflash yw~ 快乐编码
        猜你喜欢
        • 2016-09-14
        • 2010-09-19
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 2011-11-18
        相关资源
        最近更新 更多