2015-01-19 2 views
-2

다양한 길이의 중첩 목록이 있습니다. 각 색인별로 알파벳 순으로 정렬하고 싶습니다. 이 말을 그건, 내가 가진 :Python에서 가변 길이의 중첩 목록 정렬

a = [['header1', 'header2', 'header3'], 
    ['apple', 'banana', 'apple' ], 
    ['kiwi', 'pear', 'banana' ], 
    ['peach', None,  'orange' ], 
    ['pear',  None,  None ]] 

내가 루프를 통해 이동하고 값을 일시적으로 목록을 만들 수 있도록 중첩 사용하여 시도했다 :

a = [['header1', 'header2', 'header3'], 
    ['apple', 'pear', 'banana' ], 
    ['pear', 'banana', 'orange' ], 
    ['kiwi',  None,  'apple' ], 
    ['peach', None,  None ]] 

나는 다음과 같은 출력 작업을하고 싶습니다 정렬 및 다시 추가하기 전에 특정 인덱스에 대해 인덱스 오류가 발생하는 것 같습니다 (None 값 때문일 수 있습니다)?

중첩 루프가이를 수행하는 가장 효율적인 방법인지 이해하는 것이 좋습니다. 원래는 itemgetter을 사용하여 중첩 목록을 정렬했지만 그 다음에 전치 부호를 사용하고 map(lambda *row: list(row), *a)을 사용했습니다. 이렇게해도 주문이 보존되지 않았습니다.

지금까지 볼 수있는 한 중첩 된 목록 전체에서 인덱스를 유지하지 않고서는 전치 된 중첩 목록에 itemgetter을 사용할 수 없습니다.

+0

는 또한 일부 쉼표를 놓치고, strNone을 비교할 수 있다는 것입니다. 파이썬 콘솔에 넣은 것을 붙여 넣고 작동하는지 확인하십시오. – khelwood

+0

알려 주셔서 감사합니다. 이제이 문제가 해결 된 것 같습니다. – samg86

+0

커스텀 비교자를 가진'sorted' 내장 함수는 잘 동작 할 것이고, 생성자 표현식은 임시리스트보다 더 편리 할 것입니다. "재 추가"오류는 사소한 실수로 보입니다. –

답변

1

zip 표시 (zip(*a))를 사용하면 행을 열로 변환 할 수 있습니다. 그런 다음 열을 정렬하고 다시 변환하십시오. 유일한 문제는 일부 사용자 지정 정렬 알고리즘을 정의해야합니다 있도록 예컨대 :

def sorter(char): 
    if char is None: 
     return chr(0x101111) # largest character 
     # this is certainly a kludge solution, but I can't 
     # find a better one in the minimal time I have to research 
     # hopefully comments will find better! 
    else: 
     return char 

a = [['header1', 'header2', 'header3'], 
    ['apple', 'pear', 'banana' ], 
    ['pear', 'banana', 'orange' ], 
    ['kiwi',  None,  'apple' ], 
    ['peach', None,  None ]] 

a_headers, a_rows = a[0], a[1:] 
a_to_columns = list(zip(*a_rows)) 
sorted_a_columns = [sorted(lst, key=sorter) for lst in a_to_columns] 
result = [a_headers] + list(map(list, zip(*sorted_a_columns)))) 

>>> pprint(result) 

[['header1', 'header2', 'header3'], 
['apple' , 'banana' , 'apple' ], 
['kiwi' , 'pear' , 'banana' ], 
['peach' , None , 'orange' ], 
['pear' , None , None ]] 
+0

정말 고마워, 고마워. – samg86