Reputation: 154
I have a simple election program. The following are the requirements:
class Politician
Taking number of politicians as input from user.
num_politicians = input("The number of politicians: ")
Looping and creating instances
names = []
for x in range(num_politicians):
new_name = input("Name: ")
while new_name in names:
new_name = input("Please enter another name: ")
names.append(new_name)
#### This part is the crux of my problem
### Create instances of the Politician class
#### I want to do this in a way so that i can independently
#### handle each instance when i randomize and assign votes
I have looked at:
However I could not find a solution to my problem
The Politician class is below:
class Politician:
def __init__(self, name):
self.name = str(name)
self.age = age
self.votes = 0
def change(self):
self.votes = self.votes + 1
def __str__(self):
return self.name + ": " + str(self.votes)
The Desired Output:
>>> The Number of politicians: 3
>>> Name: John
>>> Name: Joseph
>>> Name: Mary
>>> Processing...
(I use time.sleep(1.0) here)
>>> Mary: 8 votes
>>> John: 2 votes
>>> Joseph: 1 vote
My problem in one statement
I want to create class instances in the for-loop in such a way that i can assign them votes randomly (This would, I suppose, require me to independently handle instances.)
Any help would be appreciated.
Upvotes: 7
Views: 35813
Reputation: 85592
You can store your instances in a list:
politicians = []
for name in 'ABC':
politicians.append(Politician(name))
Now you can access individual instances:
>>> politicians[0].name
'A'
I used a modified version of your class that gives each politician a default age if no is provided:
class Politician:
def __init__(self, name, age=45):
self.name = str(name)
self.age = age
self.votes = 0
def change(self):
self.votes = self.votes + 1
def __str__(self):
return self.name + ": " + str(self.votes)
Now you can work with your list of politicians:
print('The Number of politicians: {}'.format(len(politicians)))
prints:
The Number of politicians: 3
this:
for politician in politicians:
print(politician)
prints:
A: 0
B: 0
C: 0
Assign random votes:
import random
for x in range(100):
pol = random.choice(politicians)
pol.votes += 1
Now:
for politician in politicians:
print(politician)
prints:
A: 35
B: 37
C: 28
The whole program:
# Assuming Python 3.
class Politician:
def __init__(self, name, age=45):
self.name = str(name)
self.age = age
self.votes = 0
def change(self):
self.votes = self.votes + 1
def __str__(self):
return '{}: {} votes'.format(self.name, self.votes)
num_politicians = int(input("The number of politicians: "))
politicians = []
for n in range(num_politicians):
if n == 0:
new_name = input("Please enter a name: ")
else:
new_name = input("Please enter another name: ")
politicians.append(Politician(new_name))
print('The Number of politicians: {}'.format(len(politicians)))
for politician in politicians:
print(politician)
print('Processing ...')
for x in range(100):
pol = random.choice(politicians)
pol.votes += 1
for politician in politicians:
print(politician)
And the usage:
The number of politicians: 3
Please enter a name: John
Please enter another name: Joseph
Please enter another name: Mary
The Number of politicians: 3
John: 0 votes
Joseph: 0 votes
Mary: 0 votes
Processing ...
John: 25 votes
Joseph: 39 votes
Mary: 36 votes
As @martineau suggests, for real-live problems a dictionary would be more useful.
Create dictionary instead of a list:
politicians = {}
and in the loop us the name as key when you add your instance:
politicians[new_name] = Politician(new_name)
Upvotes: 13