만약 수많은 자료들 중에 특정값을 기준으로 정렬한 후 값이 가장 큰 특정 개수만큼만 꺼집어 내는 간단한 방법이 없을까요?
서버 프로그램의 경우에서처럼 수많은 커넥션들 중에서 전송속도가 가장 큰 10개를 선택하고 싶다고 했을 경우에 말이죠~
위와 같은 경우 리스트를 이용하면 간단히 해결할 수 있습니다.
구체적인 예를 들며 살펴보기로 하죠.
<전송속도:소켓디스크립터> 쌍으로 이루어진 자료가 있다고 합시다.
전송속도는 해당 소켓디스크립터로 연결된 원격지와의 전송속도라가 가정합니다.
아래와 같은 리스트를 생각해봅니다.
[(전송속도, 소켓디스크립터), (전송속도, 소켓디스크립터),,,,,,]
즉 (전송속도, 소켓디스크립터) 튜플이 값인 리스트를 생각하는 겁니다.
아래의 소스를 봅시다
# socklist = (전송속도, 소켓디스크립터), count = 선택할 개수
def selectSortedSocks(socklist, count):
mySocks = []
for speed, sock in socklist:
mySocks.append((-speed, sock))
mySocks.sort()
del mySocks[count:]
mySocks = [x[1] for x in mySocks]
return mySocks
위에서 정의한 함수를 간단히 살펴보죠.
위의 함수는 (전송속도, 소켓디스크립터)가 값인 리스트와 개수를 입력받으면, 리스트에서 속도가 가장 큰 순서의 입력한 개수 만큼의 소켓 디스크립터들을 리턴합니다.
그럼 코드를 설명하면,
입력된 인자인 socklist 에서 전송속도 부분을 음수로 바꾼 후 새로운 리스트에 입력합니다.
for speed, sock in socklist:
mySocks.append((-speed, sock))
mySocks.sort()
그리고 정렬하면 값이 가장 큰 순서대로 정렬되죠. 즉 아래와 같이 정렬될 것입니다.
정렬된 예 : [(-300, sock1), (-200, sock2), (-100, sock3)]
이 함수의 역할은 전송속도가 가장 큰 count개를 선택해서 소켓디스크립터들만 리턴하는 함수이므로, 전송속도가 순위 밖인 것은 모두 삭제한 후 소켓 디스크립터만을 선택하고 이를 리턴하면 됩니다.
del mySocks[count:]
mySocks = [x[1] for x in mySocks]
return mySocks
자 그럼 아래의 코드를 삽입한 후 한번 실행해 볼까요??
if __name__ == "__main__":
socklist = [(100, 'sock1'), (55, 'sock2'), (132, 'sock3'), (320, 'sock4'), (98, 'sock5')]
result = selectSortedSock(socklist, 3)
print result
결과는 아래와 같아야 하겠습니당~
['sock4', 'sock3', 'sock1']
그럼 리스트를 이용해서 위와 같은 부류의 문제에 직면하였을때는 쉽게 해결할 수 있으리라 생각됩니다. ^^


