2013-10-11 6 views
0

CS1 용 프로젝트에서 작업하고 있습니다.이 코드를 분해하는 데는 거의 다되었지만,이 부분이 저를 곤란하게 만들었습니다! 이 프로젝트의 목적은 수천 개의 이름이있는 파일을 참조하여 특정 연도의 상위 20 개 이름 목록을 만드는 것입니다. 각 파일의 각 줄에는 이름, 성별 및 발생 빈도가 포함됩니다. 이 파일은 성별에 따라 구분됩니다 (여성 이름은 발생 순서대로 남성 이름 순으로 표시됨). 각 항목이 목록의 클래스 내에 포함되어있는 지점까지 코드를 가져 왔습니다 (이 목록은 메모리 항목의 긴 목록 임). 다음은 지금까지 가지고있는 코드입니다. 나는이 시점에서 할 수 있다면Python : 클래스 객체로 목록 정렬

class entry(): 
    __slots__ = ('name' , 'sex' , 'occ') 

def mkEntry(name, sex, occ): 
    dat = entry() 
    dat.name = name 
    dat.sex = sex 
    dat.occ = occ 
    return dat 

##test = mkEntry('Mary', 'F', '7065') 
##print(test.name, test.sex, test.occ) 

def readFile(fileName): 
    fullset = [] 
    for line in open(fileName): 
     val = line.split(",") 
     sett = mkEntry(val[0] , val[1] , int(val[2])) 
     fullset.append(sett) 
    return fullset 

fullset = readFile("names/yob1880.txt") 
print(fullset) 

나는 일종의() 또는 다른 기능의 사용을 통해이 목록을 정렬하지만, 그래서 (각 항목에 dat.occ)들이 발생하여 목록을 정렬 할 수 있습니다 궁금 무엇 최종 결과에서 나는 성별과 별개로 정렬 된 목록을 가지게 될 것이고, 그 시점에서 목록에있는 첫 번째 항목을 인쇄 할 수 있습니다. 이런 식으로 목록을 정렬 할 수 있습니까? 오른쪽

fullset.sort(key=lambda x: x.occ, reverse=True) 

답변

1

예, sort()을 사용하여 개체의 목록을 정렬 할 수 있습니다. sort()은 선택적 인수 key으로 함수를 사용합니다. key 함수는 비교하기 전에 목록의 각 요소에 적용됩니다.당신이 그들의 절대 값으로 정수의 목록을 정렬하고 싶었 예를 들어, 당신은 귀하의 경우에는 다음과 같은

>>> a = [-5, 4, 6, -2, 3, 1] 
>>> a.sort(key=abs) 
>>> a 
[1, -2, 3, 4, -5, 6] 

을 할 수있는, 당신은 예를 들어, 각 개체의 발생 횟수를 추출하는 사용자 정의 key가 필요

def get_occ(d): return d.occ 
fullset.sort(key=get_occ) 

(익명 함수 : fullset.sort(key=lambda d: d.occ))을 사용할 수도 있습니다. 그런 다음이 목록에서 상위 20 개 요소 만 추출하면됩니다.

기본적으로 sort은 요소를 오름차순으로 반환합니다. fullset.sort(key=get_occ, reverse=True)

+0

이것은 완벽하게 작동했습니다! 고마워요 ^.^우리는 핵심 기능에 대해 아직 배운 havent하지만 불행히도 내 교수가 받아들이지 않으면 완전히 새로운 방법을 찾아야 할 수도 있습니다 D :하지만 그것을 보여 주셔서 감사합니다 :) – BLU

0

이는 내림차순으로 occ 속성을 사용하여 목록을 정렬? 파이썬에서 사용할 수있는 다양한 순서 지정 함수에 대해 key 키워드 인수를 사용해야합니다.

import operator 
getocc = operator.attrgetter('occ') 
sorted(fullset, key=getocc) 

을하지만 목록이 꽤 큰 것 같은데 : 아마도

getocc = lambda entry: entry.occ 
sorted(fullset, key=getocc) 
# or, for in-place sorting 
fullset.sort(key=getocc) 

또는 예를

를 들어 일부는 대신 사용자 정의 람다의 operator.attrgetter를 사용하는 것이 더 파이썬 생각 할 수있다. 목록의 처음 몇 개 항목 만 원한다면 불필요하게 값 비싼 작업 일 수 있습니다. 당신은 단지 값을 원하는 경우 예를 들어, O (N) 시간에 그것을 얻을 수 있습니다 :

min(fullset, key=getocc) # Same getocc as above 

당신이, 말, 할 수 있습니다 use a heap 대신 정렬의 처음 세를합니다.

import heapq 
heapq.nsmallest(3, fullset, key=getocc) 

힙 전체 목록을 정렬하지 않고 목록에서 정렬 된 요소의 조각을 얻기위한 유용한 데이터 구조입니다. 위의 값은 sorted(fullset, key=getocc)[:3]과 같지만 목록이 클 경우 더 빠릅니다.

희망 사항으로는 heapq.nlargest과 동일한 인수를 사용하여 3 번째로 큰 값을 얻을 수 있기를 바랍니다. 마찬가지로 정렬을 취소하거나 minmax으로 바꿀 수 있습니다.

0

나는 그냥 각 개체의 'OCC'속성의 값을 정렬 할 생각 :

+0

나는 사람들이 어떤 이유로 그들을 좋아한다고는하지만 필자는'operator. * getter' 도구가 특히 Pythonic이라고 생각하지 않습니다. 사소한 성능상의 이점이 있지만 매우 취약합니다. 두 번째로 재미있는 결과를 얻고 싶다면 어쨌든 함수를 사용해야합니다. – DSM

+0

@DSM 나는 그들의 힘이 그들의 전문 분야에 있다고 생각한다. 만약 그들이 일반적인 것이라면 TIMTOWDI가 됨으로써 평범하지 않을 것입니다. – kojiro

0

가끔씩 만 목록을 정렬하겠습니까? 종류() 매개 변수가 key을 임명했다, 당신은 다음과 같이 수행 할 수 있습니다
fullset.sort(key=lambda x: x.occ)