2013-10-11 38 views
0

我对python中的类感到困惑。我不希望任何人写下原始代码,但建议使用它的方法。现在我有以下代码...对象/类/列表Python

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

这段代码的功能是基于一年的文件输入。该程序放置在一个文件夹中,其中包含一些与它们有不同年份的文本文件。然后,我做了一个类...

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

这个类只是定义我应该做什么对象。该项目的目标是建立对象并基于这些对象创建列表。我的主要函数返回一个包含看起来像以下几个元素的列表:

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

这些元素在lst[0]有一个名字,性别M[1]F[3]一个occurence。我试图找到前20名男性和女性候选人并将其打印出来。

目标- 应该有一个函数创建一个名称条目,即mkEntry。应该是 传递适当的信息,建立一个新的对象,填充这些字段,并返回 它。

+0

究竟是什么问题? – jwodder

+0

我正在尝试填充对象并生成一个列表,其中包含前20 M和前20个F。 – steve

+0

这不是一个问题。你究竟有什么问题? – jwodder

回答

0

如果您只需要一个方便的容器类来存放数据,我建议使用collections模块中的namedtuple类型工厂,该模块专为此设计。您应该也可以使用csv模块来处理读取您的文件。 Python随附“包含电池”,因此请学习使用标准库!

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] 

注:如果您使用Python 2里,csv模块需要你open在二进制模式的文件(与'rb'第二个参数),而不是使用newlines参数。

如果你的文件有你在这个例子输出中使用的单人,你得有一个Person对象的列表:

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

您可以访问不同的值或者通过指数(如listtuple)或按属性名称(如自定义对象):

>>> 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.) 

就是这样。

如果你真的想要一个mkEntry功能无论如何,这将只是一个班轮:return Names(etc.)

0

我知道你说的不是写出来的代码,但它只是更容易这样解释。你不需要使用插槽 - 他们是为了一个专门的优化目的(如果你不知道它是什么,你不需要它)。

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() 

我用一对夫妇的功能在这里,可能看起来有点吓人,但他们是很容易的,一旦你习惯了他们(你会看到他们遍布Python代码)。列表理解为我们提供了一种将我们的人员列表过滤为性别的简单方法。 lambda给你一个匿名函数。 [:20]语法说,给我这个列表的前20个元素 - 参考列表切片。

你的情况很简单,你可能甚至不需要类/对象,但它应该给你一个你如何使用它们的想法。 Python中还有一个csv阅读库,如果csvs比较复杂(引用字段等),它可以帮助你。