如何快速从列表列表中的项目转换为python中的词典列表?

时间:2014-07-11 23:01:51

标签: python

假设我有以下结构:

listoflist = [[0,1,2,3,4],[2,4,2,3,4],[3,4,5,None,3],...]

假设我有:

headers = ["A","B","C","D","E"]

我想将每个转换为:

listofobj = [{"A":0,"B":2,"C":3,"D":4,"E":5},{"A":2,"B":4,"C":2,"E":4}]

这样做的最佳方式是什么?

请注意,D:不会显示转换列表中的第3个字典,因为它是None。我正在为此寻找最佳方式/最快性能。

5 个答案:

答案 0 :(得分:2)

您可以使用list comprehension对列表的每个元素执行操作,zip内置函数将headers的每个元素与listoflist中的相应元素相匹配和dict内置函数将每个转换为字典。所以,你想要的代码是

listofobj = [dict(zip(headers, sublist)) for sublist in listoflist]

删除None值最好在另一个函数中完成:

def without_none_values(d):
  return {k:d[k] for k in d if d[k] is not None}

使用该功能,我们可以使用

完成列表
listofobj = [without_none_values(dict(zip(headers, sublist))) for sublist in listoflist]

答案 1 :(得分:1)

使用字典理解在Python中轻松做到> = 2.7:

listofobj = [
    { k: v for k, v in zip(headers, sublist) if v is not None } 
         for sublist in listoflist
]

在Python 2.6中,需要使用dict

listofobj = [
    dict((k, v) for k, v in zip(headers, sublist) if v is not None)
         for sublist in listoflist
]

答案 2 :(得分:0)

我会使用list列表遍历每个zipheaders

headers = ["A","B","C","D","E"]
listoflist = [[0,1,2,3,4],[2,4,2,3,4],[1,2,3,4,4],[5,6,7,8,9],[0,9,7,6,5]]
[dict(zip(headers, sublist)) for sublist in listoflist]

输出

[{'A': 0, 'C': 2, 'B': 1, 'E': 4, 'D': 3},
 {'A': 2, 'C': 2, 'B': 4, 'E': 4, 'D': 3},
 {'A': 1, 'C': 3, 'B': 2, 'E': 4, 'D': 4},
 {'A': 5, 'C': 7, 'B': 6, 'E': 9, 'D': 8},
 {'A': 0, 'C': 7, 'B': 9, 'E': 5, 'D': 6}]

答案 3 :(得分:0)

[x for x in l if x is not None]保留所有不是None

的值

我们enumerate超过headers并使用sublist访问listoflist l[ind]if l[ind]中相应索引处的元素。

如果值不是True,则

None将为is None,因此我们将该元素用作键,否则如果值为list_of_obj = [dict(zip([x for ind ,x in enumerate(headers) if l[ind] is not None],[x for x in l if x is not None])) for l in listoflist] 则忽略它。

{{1}}

答案 4 :(得分:0)

使用标题作为索引,从listoflist中的每个列表创建一个Pandas Series对象。 然后使用dropna()方法删除None值。最后从每个系列中创建一个字典。

import pandas as pd
listofobj = [dict(pd.Series(x, index = headers).dropna()) for x in listoflist]