我对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。它应该是 传递适当的信息,建立一个新的对象,填充字段,然后返回 它
答案 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