2011-10-14 4 views
1

나는 처리 한 이러한 복잡한 데이터 파일을 가지고 있으며 각 파일이 처리 될 때 orderedDictionary를 사용하여 키와 값을 캡처했습니다. 각 orderedDictionary는 목록에 추가되므로 최종 결과는 사전 목록입니다. 이 파일들에 포착 된 데이터의 다양성 때문에 그들은 공통적 인 많은 키들을 가지고 있습니다. 그러나 데이터를 Excel로 내보내는 것이 내가 기대했던 것보다 더 복잡하게 만드는 비결한 키가 있습니다. 왜냐하면 필자가 일관되게 구조.어떻게 복잡한 사전 키를 정렬 할 수 있습니까?

각 키는, 그래서 예를 들어 나는 하위 항목 D 있기 때문에

Question 123 
SubItem D 
Column C 
Instance 17 

을 다음과 같이

Q_123_SUB_D_COLUMN_C_NUMB_17 

우리는 키를 변환 할 수 있습니다

Q_#_SUB_A_COLUMN_#_NUMB_# 

같은 구조를 가지고 열 C와 인스턴스 17에는 SubItemA, Column B 및 Instance가 있어야합니다.

그러나 소스 파일 중 하나는 내가 사전의 목록을 반복 할 때 너무

Q_123_SUB_D_COLUMN_C_NUMB_13 

으로 종료 할 수있는 데이터 값 (위의 예와 다른 소스 파일까지 다양 키를 채울 수 있습니다 csv.dictwriter에서 열 제목으로 사용할 수 있도록 모든 고유 키 인스턴스를 가져 오려면 내 계획은 고유 한 열 제목의 결과 목록을 정렬하는 것이었지만 정렬 작업을 할 수없는 것처럼 보였습니다.

결과가 같아 지도록 정렬해야합니다.

Q_122_SUB_A_COLUMN_C_NUMB_1 
Q_122_SUB_B_COLUMN_C_NUMB_1 
Q_123_SUB_A_COLUMN_C_NUMB_1 
Q_123_SUB_B_COLUMN_C_NUMB_1 
Q_123_SUB_C_COLUMN_C_NUMB_1 
Q_123_SUB_D_COLUMN_C_NUMB_1 
dot 
dot 
dot 
Q_123_SUB_A_COLUMN_C_NUMB_17 
Q_123_SUB_B_COLUMN_C_NUMB_17 
Q_123_SUB_C_COLUMN_C_NUMB_17 
Q_123_SUB_D_COLUMN_C_NUMB_17 

큰 문제는 특정 파일 세트를 열어보기 전에 얼마나 많은 질문에 답변을 받았는지, 몇 가지 하위 질문에 답을 할 수 있는지, 각 질문 또는 하위 질문과 얼마나 많은 열이 연관되어 있는지, 일부 질문, 하위 질문 또는 열의 특정 조합이 많은 경우가 있으며 원하지 않습니다. 파이썬을 사용하여 1,200 줄의 SAS 코드를 95 개로 줄일 수 있었지만 CSV 파일에 쓰기 시작하기 전에이 마지막 조금만 알아 냈습니다.

어떤 관찰이라도 이해 될 것이다.

내 계획은 사전 목록을 반복하여 모든 고유 키를 찾은 다음이 키를 올바르게 정렬하여 키를 열 머리글로 사용하여 CSV 파일을 만들 수 있습니다. 나는 고유 한 키를 찾아서 수동으로 정렬 한 다음 정렬 된 파일을 다시 읽을 수는 있지만 어색해 보입니다.

답변

4

정렬 할 때 키로 충분히 똑똑한 기능 만 제공하십시오.

>>> (lambda x: tuple(y(z) for (y, z) 
        in zip((int, str, str, int), 
          x.split('_')[1::2])))('Q_122_SUB_A_COLUMN_C_NUMB_1') 
(122, 'A', 'C', 1) 
+0

을 통해 첫 번째를 추적하는 것이 쉬웠다 그래서

list_to_sort.sort(key=itemgetter(0,3,1,2) 

같은 종류를 할 수 있었다 필요하지 않았다 이 인상적인 비트 코드 – PyNEwbie

+0

조각으로 시작한 다음 '람다'로가는 길. –

+0

감사합니다. – PyNEwbie

2

정규식을 사용하여 키의 다른 부분을 추출하고이를 사용하여 정렬 할 수 있습니다.


import re 

names = '''Q_122_SUB_A_COLUMN_C_NUMB_1 
Q_122_SUB_B_COLUMN_C_NUMB_1 
Q_123_SUB_B_COLUMN_C_NUMB_1 
Q_123_SUB_A_COLUMN_C_NUMB_17 
Q_123_SUB_D_COLUMN_C_NUMB_1 
Q_123_SUB_B_COLUMN_C_NUMB_17 
Q_123_SUB_C_COLUMN_C_NUMB_1 
Q_123_SUB_C_COLUMN_C_NUMB_17 
Q_123_SUB_A_COLUMN_C_NUMB_1 
Q_123_SUB_D_COLUMN_C_NUMB_17'''.split() 

def key(name, match=re.compile(r'Q_(\d+)_SUB_(\w+)_COLUMN_(\w+)_NUMB_(\d+)').match): 
    # not sure what the actual order is, adjust the priorities accordingly 
    return tuple(f(value) for f, value in zip((str, int, int, str), match(name).group(3, 4, 1, 2))) 

for name in names: 
    print name 

names.sort(key=key) 

print 

for name in names: 
    print name 

키 추출 과정을 설명하기 위해

예를 들어, 우리는 키가 특정 패턴을 가지고 있다는 것을 알고있다. 정규식은 여기서 훌륭하게 작동합니다.

r'Q_(\d+)_SUB_(\w+)_COLUMN_(\w+)_NUMB_(\d+)' 
# ^  ^  ^  ^
#  digits letters  letters digits 
#  group 1 group 2  group 3 group 4 

정규 표현식에서 괄호로 묶은 문자열의 일부는 그룹입니다. \d은 십진수를 나타냅니다. +은 이전 문자 중 하나 이상이 있어야 함을 의미합니다. 따라서 \d+은 하나 이상의 십진수를 의미합니다. \w은 편지에 해당합니다.

문자열이이 패턴과 일치하면 group 메서드를 사용하여 해당 문자열의 각 그룹에 쉽게 액세스 할 수 있습니다. 당신은이 이그나시오의 접근 방식, 패턴에 대한 엄격한 만 많이 유사하다

m = match('Q_122_SUB_B_COLUMN_C_NUMB_1') 
# m.group(1) == '122' 
# m.group(2) == 'B' 
# m.group(3, 4) == ('C', '1') 

, 단지 더 그룹 번호도

예를 포함하여 여러 그룹에 액세스 할 수 있습니다. 일단이 주위에 머리를 감쌀 수 있다면, 정렬을위한 적절한 키를 만드는 것이 간단해야합니다. 키를 가정

+0

이것은 위대하다. 그러나 나는 그것을 안전하게 구현하기에는 너무 어리 석다. 오늘 밤 마감일을 맞이하고 있지만 시간이 지나면 이것을 배우고 좀 더 배울 수 있습니다. 시간을내어 주셔서 감사합니다 – PyNEwbie

+0

나는 그것이 어떻게 작동 하는지를 설명 할 것이므로 당신이 그것을 볼 기회를 얻었을 때, 여기서 무슨 일이 일어나고 있는지 이해할 것입니다. –

+0

와우, 네가 겪은 고마움을 고맙게 생각해 줘서 고맙다. – PyNEwbie

0

list_to_sort=[] 

for key in keyList: 
    sortKeys=key.split('_') 
    keyTuple=(sortKeys[1],sortKeys[-1],sortKeys[3],sortKeys[5],key) 
    list_to_sort.append(keyTuple) 

이 후 목록의 항목은 내가 itemgetter이 있지만 않습니다 정확히 모르겠습니다

(123,17,D,C,Q_123_SUB_D_COLUMN_C_NUMB_17) 


from operator import itemgetter 

list_to_sort.sort(key=itemgetter(0,1,2,3) 

같이 튜플이하여 keyList 말, 목록에 포함되어 있습니다 이 방법은 효과적이지만 다른 두 가지 방법보다 덜 우아하지만 덜 우아합니다.

튜플에 키를 배치하여 키가 실제로 나타나는 방식과 다른 순서로 정렬합니다. 그건 내가

for key in keyList: 
    sortKeys=key.split('_') 
    keyTuple=(sortKeys[1],sortKeys[3],sortKeys[5],sortKeys[7],key) 
    list_to_sort.append(keyTuple) 

을 수행하고 나를 그래서 번역을 배울 수있는 방법을

관련 문제