2011-02-06 4 views
2

파이썬을 사용하여 사전에 특정 값을 읽는 데 약간의 도움이 필요합니다. 사용자 번호가있는 CSV 파일이 있습니다. 그래서 사용자 1,2,3 ... 각 사용자는 특정 부서 1,2,3 ...에 있고 각 부서는 특정 건물 1,2,3에 있습니다. 그래서 목록에 올릴 수있는 방법을 알아야합니다. 건물 1의 부서 1에있는 모든 사용자, 건물 1의 부서 2에있는 모든 사용자. 나는 csv.ReadDict를 사용하여 방대한 사전에 모든 것을 읽으려고 노력해 왔지만 사전의 각 사전에있는 항목을 검색 할 수 있다면이 방법이 효과적이다. 이 파일을 정렬하는 방법에 대한 아이디어가 있습니까? CSV에는 사용자가 150,000 개가 넘습니다. 각 행은 새로운 사용자이고 user_name, departmentnumber, department building의 세 가지 속성을 나열합니다. 100 개의 부서와 100 개의 건물과 150,000 명의 사용자가 있습니다. 짧은 스크립트를 사용하여 아이디어를 모두 분류 할 수 있습니까? 사전사전으로 읽은 후 특정 값에 대한 파이썬 CSV 검색

+0

로 확장 할 수

다음에 "사용자 _ 전환

과 같을 것이다 ". 무엇 이니? 건물 번호와 부서 번호 및 사용자 번호는 항상 정수입니까? –

답변

2

에서 당신의 도움을 주셔서 감사합니다 무차별 접근 방식은 가

import csv 
csvFile = csv.reader(open('myfile.csv')) 
data = list(csvFile) 
data.sort(key=lambda x: (x[2], x[1], x[0])) 
이 그런 다음 당신은 "사용자 번호"로 시작

import csv 
import collections 

csvFile = csv.reader(open('myfile.csv')) 
data = collections.defaultdict(lambda: collections.defaultdict(list)) 

for name, dept, building in csvFile: 
    data[building][dept].append(name) 

buildings = data.keys() 
buildings.sort() 
for building in buildings: 
    print "Building {0}".format(building) 

    depts = data[building].keys() 
    depts.sort() 
    for dept in depts: 
     print " Dept {0}".format(dept) 

     names = data[building][dept] 
     names.sort() 
     for name in names: 
      print " ",name 
+0

영업 부서는 부서 1에 부서 2가 오길 원합니다. 솔루션은 부서 10에 따라 부서 1을 따릅니다. 숫자에 공백이있는 경우 솔루션이 더 나빠집니다. –

+0

훌륭하게 작동했습니다. 고맙습니다. –

+0

@ John Machin : 건물은 번호가 아닌 이름으로 식별되며, 알파벳 순서로 표시되는 것으로 추정됩니다 (사실 일 것 같습니다). 다른 순서가 필요한 경우 적절한 키 함수를 sort()에 전달하여 수행 할 수 있습니다. –

관련 문제