2016-07-06 7 views
0

2 차원 파이썬 dict에 csv 파일 또는 엑셀 시트 (행 및 열 포함)의 데이터를로드해야합니다. 예를 들어, 엑셀 시트의 데이터는 다음과 같습니다 경우 : 공유 메모리가있는 2 차원 파이썬 dict

name age gender location 
1 Jim 18 male China 
2 Ross 18 male China 
3 Cara 19 female Japan 
4 Ted 18 male China 

그런 다음 출력 파이썬 딕셔너리는 다음과 같아야합니다

data = { 
    1: {'name': 'Jim', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    2: {'name': 'Ross', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    3: {'name': 'Cara', 'age': 19, 'gender': 'female', 'location': 'Japan'}, 
    4: {'name': 'Ted', 'age': 18, 'gender': 'male', 'location': 'China'} 
} 

을 중복 정보를 정기적으로 많은의가 있음을 볼 수있다 이 2-d dict (실제 데이터의 경우 동일한 조건을 가짐), 공유 메모리를 사용하여 새로운 dict를 개발하는 아이디어를 생각해 냈습니다. 구체적으로 말하자면 위의 예에서 2 차원 dict은 여러 행에 걸쳐 {'age': 18, 'gender': 'male', 'location': 'China'} 사본 하나만 저장하기를 원합니다.이 행은 인접하지 않아도됩니다. data[1]['age']data[2]['age']을 호출하면 추출한 작은 공유 사전에서 조회를 수행해야합니다.

나는 python dict의 소스 코드를 읽었으며 python dict는 키와 값에 대한 포인터 만 저장한다는 것을 알고있다. (일반적으로 작은 int와 string 객체의 경우 다른 포인터가 같은 객체를 가리킬 수있다.) 따라서 하나의 사본 만 저장하려는 경우 포인터 사본 하나를 의미합니다.

이 사전을 디자인하는 방법에 대한 아이디어가 있으십니까? 매우 감사합니다!!!

죄송 편집, 내가 언급하는 것을 잊지. 이 2 차원 dict의 데이터는 읽기 전용입니다.

+3

이것은 아주 나쁜 생각처럼 들린다. Jim의 위치를 ​​변경하면 갑자기 Ross와 Ted도 변경되었습니다. –

+0

@Kelvin 죄송합니다, 언급하는 것을 잊었습니다. 이 dict의 데이터는 읽기 전용입니다. –

+3

이 사람들 사이에 본질적인 공유 구성 요소가 없으면 [압축 알고리즘] (https://en.wikipedia.org/wiki/)이 원하는 것처럼 들립니다. Data_compression). 원칙적으로 사전에있는 항목에 액세스하는 속도가 느려지므로 공간 대 속도의 상충 관계가됩니다. –

답변

1

데이터 압축 솔루션에 대해 묻고 싶습니다. 그러면 메모리 크기와 참조 사용을 고려해야합니다. 최소 메모리 풋 프린트는 일반적으로 적어도 메모리 참조만큼 작은 정수에 속하므로 너무 불편하지 않다면 모든 것을 정수로 매핑하려고합니다. 또한 목록은 사전보다 작으며 직접 인덱싱을 허용합니다.

import sys 

data = { 
    1: {'name': 'Jim', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    2: {'name': 'Ross', 'age': 18, 'gender': 'male', 'location': 'China'}, 
    3: {'name': 'Cara', 'age': 19, 'gender': 'female', 'location': 'Japan'}, 
    4: {'name': 'Ted', 'age': 18, 'gender': 'male', 'location': 'China'} 
} 

In [43]: sys.getsizeof(data) 
Out[43]: 280 # bytes 

data_list = [ 
    ('Jim', 18, 0, 'CH'),  # 'CH' => 'China' 
    ('Ross', 18, 0, 'CH'), # 0 => Female, 1 => Male 
    ('Cara', 19, 1, 'JP'), # 'JP' => 'Japan' 
    ('Ted', 18, 0, 'CH') 
] 


In [44]: sys.getsizeof(data_list) 
Out[44]: 104 # bytes 

_name, _age, _gender, _location = 0, 1, 2, 3 

In [45]: data_list[2][_age] # access as 2D array instead of 2-level dict 
Out[45]: 19 

솔루션은 위의 약간 느려질 수 있지만 큰 문자열에 대한 몇 가지 혜택을 얻을 것입니다 :

여기에 몇 가지 아이디어를 촉발 수있는 대안 구현입니다. 참조를 사용하면 각 레코드가 오래 걸리지 않으면 아무 것도 저장할 수 없습니다. 마지막으로 문자열 이름과 국가 코드 대신 모든 값을 정수로 바꾸면 Python 목록을 사용하여 압축합니다.

당신이 정말로 예를 들어이 사이트, 최고의 압축을 줄 것이다 숫자 코드를 선택 들어갈 허프만 코딩 보길 원하는 경우

는 : http://www.geeksforgeeks.org/greedy-algorithms-set-3-huffman-coding