본문 바로가기

Language/Python

Python | List 요소값 기준 정렬(itemgetter)

반응형

다음과 같은 공백으로 구분지어진 파일이 있다.

 

  67317 test            50258   9 13 17:14 00 Public/APP icon (11th)/cs/Android/app_icon_test_144_CS.png
  67317 test            80097   9 13 17:14 00 Public/APP icon (11th)/cs/Android/app_icon_test_192_CS.png
  67317 test             5168   9 13 17:14 00 Public/APP icon (11th)/cs/Android/app_icon_test_36_CS.png
  67317 test             8107   9 13 17:14 00 Public/APP icon (11th)/cs/Android/app_icon_test_48_CS.png
  67317 test           445433   9 13 17:14 00 Public/APP icon (11th)/cs/Android/app_icon_test_512_CS.png
  67317 test            15799   9 13 17:14 00 Public/APP icon (11th)/cs/Android/app_icon_test_72_CS.png
  67317 test            25510   9 13 17:14 00 Public/APP icon (11th)/cs/Android/app_icon_test_96_CS.png
  67317 test          1395503   9 13 17:14 00 Public/APP icon (11th)/cs/iOS/app_icon_test_1024_CS.png
  67317 test           445433   9 13 17:14 00 Public/APP icon (11th)/cs/iOS/app_icon_test_512_CS.png
  67317 test            50672   9 13 17:14 00 Public/APP icon (11th)/ct/Andriod/app_icon_test_144_CT.png
  67317 test            80623   9 13 17:14 00 Public/APP icon (11th)/ct/Andriod/app_icon_test_192_CT.png
  67317 test             5188   9 13 17:14 00 Public/APP icon (11th)/ct/Andriod/app_icon_test_36_CT.png
  67317 test             8157   9 13 17:14 00 Public/APP icon (11th)/ct/Andriod/app_icon_test_48_CT.png
  67317 test           439482   9 13 17:14 00 Public/APP icon (11th)/ct/Andriod/app_icon_test_512_CT.png
  67317 test            15937   9 13 17:14 00 Public/APP icon (11th)/ct/Andriod/app_icon_test_72_CT.png
  67317 test            25694   9 13 17:14 00 Public/APP icon (11th)/ct/Andriod/app_icon_test_96_CT.png

 

 

 

공백으로 구분 지었을때 3번째 요소는 파일의 크기이며 이 요소를 기준으로 내림차순으로 정렬하고 알기 쉽게 표기해 본다.

 

  • 요소값 기준 정렬 : list.sort(key=itemgetter(2), reverse=True) 
    • key=itemgetter(2) : 2번 index 요소 기준 
    • reverse=True : 내림차순

 

#!/usr/bin/python3

''' bytes를 KB, MB, GB 등 알아보기 쉽게 변환 '''
def humanbytes(B):
    B = float(B)
    KB = float(1024)
    MB = float(KB ** 2)
    GB = float(KB ** 3)
    TB = float(KB ** 4)

    if B < KB:
        return '{0} {1}'.format(B,'Bytes' if 0 == B > 1 else 'Byte')
    elif KB <= B < MB:
        return '{0:.2f} KB'.format(B / KB)
    elif MB <= B < GB:
        return '{0:.2f} MB'.format(B / MB)
    elif GB <= B < TB:
        return '{0:.2f} GB'.format(B / GB)
    elif TB <= B:
        return '{0:.2f} TB'.format(B / TB)


''' 파일 오픈 '''
f = open("/root/test/test.txt", 'r', encoding='cp949')


sum = 0
list_t = []

''' 한줄씩 읽어서 공백을 기준으로 list로 만든다 '''
''' 2 번째 index 요소 합계를 sum '''
while True:
    line = f.readline()
    if not line: break
    li = line.split()
    li[2] = int(li[2])
    sum += int(li[2])
    list_t.append(li)
f.close()


''' 2번째 index 요소를 기준으로 내림차순 정렬 '''
from operator import itemgetter
list_t.sort(key=itemgetter(2), reverse=True)


''' 출력 '''
for item in list_t:
    item[2] = humanbytes(item[2])
    print(item)
print(humanbytes(sum))

 

 

 

결과 출력

 

['67317', 'test', '1.33 MB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/iOS/app_icon_test_1024_CS.png']
['67317', 'test', '434.99 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/Android/app_icon_test_512_CS.png']
['67317', 'test', '434.99 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/iOS/app_icon_test_512_CS.png']
['67317', 'test', '429.18 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/ct/Andriod/app_icon_test_512_CT.png']
['67317', 'test', '78.73 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/ct/Andriod/app_icon_test_192_CT.png']
['67317', 'test', '78.22 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/Android/app_icon_test_192_CS.png']
['67317', 'test', '49.48 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/ct/Andriod/app_icon_test_144_CT.png']
['67317', 'test', '49.08 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/Android/app_icon_test_144_CS.png']
['67317', 'test', '25.09 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/ct/Andriod/app_icon_test_96_CT.png']
['67317', 'test', '24.91 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/Android/app_icon_test_96_CS.png']
['67317', 'test', '15.56 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/ct/Andriod/app_icon_test_72_CT.png']
['67317', 'test', '15.43 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/Android/app_icon_test_72_CS.png']
['67317', 'test', '7.97 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/ct/Andriod/app_icon_test_48_CT.png']
['67317', 'test', '7.92 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/Android/app_icon_test_48_CS.png']
['67317', 'test', '5.07 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/ct/Andriod/app_icon_test_36_CT.png']
['67317', 'test', '5.05 KB', '9', '13', '17:14', '00', 'Public/APP', 'icon', '(11th)/cs/Android/app_icon_test_36_CS.png']
2.95 MB
반응형