2013-10-11 2 views
0

나는 파이썬에서 클래스에 대해 혼란 스럽다. 누구든지 원시 코드를 적어두고 코드를 작성하는 방법을 제안하기를 원하지 않습니다. 지금은 다음과 같은 코드가 있습니다 ...개체/클래스/목록 Python

def main(): 
    lst = [] 
    filename = 'yob' + input('Enter year: ') + '.txt' 
    for line in open(filename): 
     line = line.strip() 
     lst.append(line.split(',') 

이 코드의 기능은 1 년 단위의 파일 입력입니다. 이 프로그램은 여러 해를 가진 많은 텍스트 파일이있는 폴더에 저장됩니다. 그런 다음 클래스를 만들었습니다 ...

class Names(): 
    __slots__ = ('Name', 'Gender', 'Occurences') 

이 클래스는 내가해야하는 객체를 정의합니다. 이 프로젝트의 목표는 객체를 만들고 이러한 객체를 기반으로 목록을 만드는 것입니다.

[[jon, M, 190203], ...]

이러한 요소는 lst[0]에 이름을 가지고, 성별 M 또는 [1]에서 F[3]의 선두로부터 : 내 주요 기능은 다음과 같이 몇 가지 요소를 포함하는 목록을 반환합니다. 나는 20 대 남성과 여성 후보자를 찾고 그들을 인쇄하려고 노력하고 있습니다.

목표 -이름 항목을 생성하는 함수, 즉 mkEntry가 있어야합니다. 적절한 정보가 전달 된 이어야하며 새 개체를 만들고 필드를 채우고 을 반환해야합니다.

클래스에서
+0

그리고 정확히 무엇이 질문입니까? – jwodder

+0

개체를 채우고 상위 20 개의 M 및 상위 20 개의 F 발생 목록을 생성하려고합니다. – steve

+0

그건 질문이 아닙니다. 문제는 무엇입니까? – jwodder

답변

0

데이터를 저장할 편리한 컨테이너 클래스가 필요한 경우 정확하게 설계된 collections 모듈의 namedtuple 유형 공장을 사용하는 것이 좋습니다. 또한 파일 읽기를 처리하려면 csv 모듈을 사용해야합니다. 파이썬에는 "배터리 포함"이 포함되어 있으므로 표준 라이브러리를 사용하는 법을 배우십시오!

from collections import namedtuple 
import csv 

Person = namedtuple('Person', ('name', 'gender', 'occurences')) # create our type 

def main(): 
    filename = 'yob' + input('Enter year: ') + '.txt' 
    with open(filename, newlines="") as f: # parameters differ a bit in Python 2 
     reader = csv.reader(f) # the reader handles splitting the lines for you 
     lst = [Person(*row) for row in reader] 

참고 : 파이썬 2를 사용하는 경우 csv 모듈은 오히려 newlines 매개 변수를 사용하는 것보다 open ('rb'의 두 번째 인수로) 바이너리 모드에서 파일을 필요로한다.

>>> print(lst)  
[Person(name='jon', gender='M', occurences=190203)] 

당신은 인덱스에 의해 (A list 또는 같은 중 하나를 다양한 값에 액세스 할 수 있습니다

파일은 당신이 당신의 예제 출력에 사용 된 단지 한 사람이 있다면, 당신은 하나의 Person 객체 목록을 가져올 ' tuple) 또는 속성 이름 (맞춤 개체와 같은)으로 표시됩니다.

>>> jon = lst[0] 
>>> print(jon[0]) 
jon 
>>> print(jon.gender) 
M 
0

는, 다음과 같이 __init__ 방법을 추가 : 이제

def __init__(self, name, gender, occurrences): 
    self.Name = name 
    # etc. 

는 별도의 "확인"방법을 필요로하지 않는다; 클래스 자체를 생성자로 부르면됩니다.

myname = Names(lst[0], etc.) 

그리고 그게 전부입니다. 난 당신이 코드를 쓰기 만이이 방법을 설명하기 위해 단지 쉽게하지 말라고 알고 return Names(etc.)

0

: 당신이 정말로 어쨌든 mkEntry 기능을 원하는 경우

은, 그냥 한 줄 수 있습니다. 슬롯을 사용할 필요가 없습니다. 슬롯은 특수화 된 최적화 목적으로 사용됩니다 (슬롯이 무엇인지 모르는 경우에는 필요하지 않습니다).

class Person(object): 
    def __init__(self, name, gender, occurrences): 
     self.name = name 
     self.gender = gender 
     self.occurrences = occurrences 


def main(): 
    # read in the csv to create a list of Person objects 
    people = [] 
    filename = 'yob' + input('Enter year: ') + '.txt' 
    for line in open(filename): 
     line = line.strip() 
     fields = line.split(',') 
     p = Person(fields[0], fields[1], int(fields[2])) 
     people.append(p) 

    # split into genders 
    p_m = [p for p in people if p.gender == 'M'] 
    p_f = [p for p in people if p.gender == 'F'] 

    # sort each by occurrences descending 
    p_m = sorted(p_m, key=lambda x: -x.occurrences) 
    p_f = sorted(p_f, key=lambda x: -x.occurrences) 

    # print out the first 20 of each 
    for p in p_m[:20]: 
     print p.name, p.gender, p.occurrences 
    for p in p_f[:20]: 
     print p.name, p.gender, p.occurrences 

if __name__ == '__main__': 
    main() 

는 좀 무서운 보일 수 있습니다 그 여기 기능의 몇 가지를 사용했지만, 당신이 그들에 익숙해 (당신은 파이썬 코드를 통해 모두 볼 수 있습니다) 일단 그들은 충분히 쉽다. List comprehensions은 우리의 성 목록을 성별로 쉽게 필터링 할 수있는 방법을 제공합니다. 람다는 익명의 함수를 제공합니다. [: 20] 구문은이 목록의 처음 20 개 요소를 알려줍니다. 목록 조각을 참조하십시오.

사례가 매우 간단하고 클래스/개체가 실제로 필요하지는 않지만 사용 방법에 대한 아이디어를 제공해야합니다. 또한 csv가 더 복잡하면 (인용 된 필드 등) 파이썬에서 csv 읽기 라이브러리가있어 도움이 될 것입니다.