2014-07-11 2 views
-1

나는 다음과 같은 구조를 가지고 가정 :목록 목록의 항목을 파이썬의 사전 목록으로 빨리 변환하는 방법은 무엇입니까?

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 :는 변환 된 목록의 세 번째 사전에 없으므로 표시되지 않습니다. 가장 최적의 방법/빠른 성능을 찾고 있습니다.

+2

'null'입니까?파이썬에는 그 이름으로 아무것도 없습니다. – user2357112

+3

이 코드 작성 서비스가 아니기 때문에이 질문은 논제가 아닌 것 같습니다. – jonrsharpe

답변

2

를 사용할 수 있습니다.은 목록의 각 요소에 대해 zip 내장 함수를 사용하여 각 요소를 에있는 headers과 일치시키고 dict 내장 함수를 사용하여 각 요소를 사전으로 변환합니다. None 값을 제거

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

아마 가장 다른 함수에서 이루어집니다 그래서, 당신이 원하는 코드입니다 :

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

listzip에 대해 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}] 
1

쉬운 사전 이해를 사용하여 파이썬> = 2.7에서 할 출력 : 파이썬 2.6 일에서

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

이 필요

dict 사용 :

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

[x for x in l if x is not None]으로 목록을 완료 할 수 있습니다 모든 값을 유지하지 않음 None

우리 enumerateheaders 이상으로 사용하고 각각 sublistlistoflist 인 해당 색인에있는 요소에 l[ind]을 사용하여 액세스합니다.

if l[ind]None이 아니기 때문에 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] 
+0

'filter (None, l)'은 당신이 원하는 것을하지 않습니다. 특히 '0'을 제거하고 'headers'의 오른쪽 요소와 값이 일치하지 않습니다. – user2357112

+0

@ user2357112, 맞습니다 –

+0

코드를 설명하면 도움이 될까요? –

0

헤더를 색인으로 사용하여 listoflist의 각 목록에서 팬더 시리즈 개체를 만듭니다. 그런 다음 dropna() 메소드를 사용하여 None 값을 삭제하십시오. 그리고 마지막으로 각 시리즈에서 사전을 만듭니다.

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

몇 가지 설명을 추가하십시오. 코드 만 응답은 (때로는) 좋지만 코드 + 설명은 (대부분의 경우) 더 좋습니다. – Barranka

관련 문제