Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python list to store class instance?

Tags:

python

list

Given a python class class Student(): and a list names = []; then I want to create several instances of Student() and add them into the list names,

names = [] # For storing the student instances
class Student():
    def __init__(self, score, gender):
        self.score = score
        self.gender = gender

And now I want to check out the scores of all the male students, can I do it like this?

scores = []
for i in names:
    if i.gender ==  "Male":
        scores.append(i.score)

My question is: How to create a list that can (if could be done by any statement) store the instance of Student? Or rather, when I write names = [], how could I state every element in names is an instance of Student so that I can use the attributs of this element despite python is weak type? I hope I made myself clear ;)

Can I write like:

    for i in range(len(names)):
        student = Student()
        student = names[i]
        if student.gender == "Male":
            # Whatever

I guess not...

like image 915
ladyfafa Avatar asked Aug 14 '10 15:08

ladyfafa


People also ask

How do you store a class object in a list Python?

We can create list of object in Python by appending class instances to list. By this, every index in the list can point to instance attributes and methods of the class and can access them. If you observe it closely, a list of objects behaves like an array of structures in C.

How do you store class instances?

Class instances can be stored in attributes of list/dictionary type in other class instances (eg Note instance inside Notebook instance).

Can you store class instances in a dictionary Python?

Python uses dictionaries to store class and instance variables. Class variables share the same dictionary across all instances of the class, and instance variables are stored in a unique dictionary per instance. The class dict is stored in <class>.

Can Python lists store objects?

The Python list stores a collection of objects in an ordered sequence. In contrast, the dictionary stores objects in an unordered collection. However, dictionaries allow a program to access any member of the collection using a key – which can be a human-readable string.


2 Answers

Did you try your code above? It should work fine. You can condense it into:

scores = [ student.name for student in names if student.gender == "Male" ]

Note that calling the list names is misleading, since it is a list of Student instances.

You can't define the list to be a list of Student instances; that's not how Python works.

Are you asking how to create the list that you've called names?

names = [ ]
for ( score, gender ) in <some-data-source>:
    names.append( Student( score, gender ) )

which is of course equivalent to

names = [ Student( score, gender ) for score, gender in <some-data-source> ]

and in turn to

names = [ Student( *row ) for row in <some-data-source> ]

If you need to do a lot of processing for each row then you can either move the processing into a separate function or use a for loop.

def process_row( row ):
    ...
    return score, gender

names = [ Student( *process_row( row ) ) for row in <some-data-source> ]

Responding to your edit, I think you are trying to declare the types of variables in Python. You wrote:

for i in range(len(names)):
    student = Student()
    student = names[i]
    if student.gender == "Male":
        # Whatever

What is the purpose of the line student = Student() -- are you trying to declare the type of the variable student? Don't do that. The following will do what you intended:

for student in students:
   if student.gender == "Male":
       # Whatever

Notice several things:

  1. We don't need to iterate over range(n) and then look up each instance in names; iterating over every element of a container is the purpose of a for loop.
  2. You don't need to make any claims about what student is -- it could be a string, a boolean, a list, a Student, whatever. This is dynamic typing. Likewise, students doesn't have to be a list; you can iterate over any iterable.
  3. When you write student.gender, Python will get the gender attribute of student, or raise an exception if it doesn't have one.
like image 71
Katriel Avatar answered Sep 18 '22 11:09

Katriel


First of all python is not weakly typed. It is however dynamically typed so you can't specify an element type for your list.

However this does not prevent you from accessing an object's attributes. This works just fine:

names = [Student(1,"Male"), Student(2,"Female")]
scores = []
for i in names:
    if i.gender ==  "Male":
        scores.append(i.score)

It is however more pythonic to write this using a list comprehension:

names = [Student(1,"Male"), Student(2,"Female")]
scores = [i.score for i in names if i.gender == "Male"]
like image 43
sepp2k Avatar answered Sep 19 '22 11:09

sepp2k