假设我有以下结构:
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。我正在为此寻找最佳方式/最快性能。
答案 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
列表遍历每个zip
和headers
。
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]