对象/类/列表Python

时间:2013-10-11 22:43:50

标签: python list class object

我对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')

这个类只定义了我应该创建的对象。该项目的目标是基于这些对象构建对象并创建列表。我的main函数返回一个包含几个元素的列表,如下所示:

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

这些元素在lst[0]中有一个名称,在M中有一个性别F[1],在[3]中有一个出现。我正在努力寻找前20位男性和女性候选人并打印出来。

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

3 个答案:

答案 0 :(得分:0)

在您的课程中,添加__init__方法,如下所示:

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

现在你不需要单独的“make”方法;只需将类本身称为构造函数:

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

这就是它的全部内容。

如果你真的想要一个mkEntry函数,它只是一个单行:return Names(etc.)

答案 1 :(得分: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个元素 - 参考列表切片。

你的情况非常简单,你可能甚至不需要类/对象,但它应该让你知道如何使用它们。如果csvs更复杂(引用字段等),python中还有一个csv读取库可以帮助你。

答案 2 :(得分: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')而不是使用{ {1}}参数。

如果您的文件只包含您在示例输出中使用的单个人,那么您将获得一个包含一个newlines对象的列表:

Person

您可以通过索引(如>>> print(lst) [Person(name='jon', gender='M', occurences=190203)] list)或属性名称(如自定义对象)访问各种值:

tuple