BLOG main image
Category (326)
News (16)
All about me (1)
Diary (1)
Projects (8)
Programming (95)
Ideas (8)
Treasures (28)
Study (59)
Bookmark (19)
iPhone (77)
만들어보자!! Game Engine fo.. (0)
Android (0)
good post,금지
12:10 - LVcheap
good post,
02/02 - replica handbags
Good post, thanks for sharing
02/02 - replica handbags
수 있다.
01/29 - best replica watches
Good post, thanks for sharing
01/29 - best replica watches
good post, thanks for sharing..
01/28 - Rolex replica watches
http://tinsuke.wordpress.com/2..
2011 - dd
http://gyuha.tistory.com/366
2011 - d
:)
2011 - replica watches
https://github.com/x2on/libssh..
2011 - Ilyoung
C / C++ 전처리문
나태함, 그 순간은 달콤하고, 결..
영어로 일기 쓰기.
깐따삐아 Funs
전처리문 (#define, #if, #ifdef..
All about computer
전처리기
standyhon님의블로그
[파이썬] 파이썬(Py) 파일 윈도..
월풍도원(月風道院) - Delight o..
276,348 Visitors up to today!
Today 39 hit, Yesterday 199 hit
daisy rss
tistory 티스토리 가입하기!
2007/09/11 10:57

만약 수많은 자료들 중에 특정값을 기준으로 정렬한 후 값이 가장 큰 특정 개수만큼만 꺼집어 내는 간단한 방법이 없을까요?


서버 프로그램의 경우에서처럼 수많은 커넥션들 중에서 전송속도가 가장 큰 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']



그럼 리스트를 이용해서 위와 같은 부류의 문제에 직면하였을때는 쉽게 해결할 수 있으리라 생각됩니다. ^^

Trackback Address :: http://joyholic.kr/trackback/123 관련글 쓰기
Name
Password
Homepage
Secret