In this post, we will see Python Coding Question asked in TCS Xplore CPA with Solution.
Create a class Painting with the below attributes:
paintingID: string type painterName: string type paintingPrice: int type painting type: string type
create constructor (__init__ method) which takes all the above attributes in the same sequence.
Method will set the values passed as an argument to the attributes of the Painting object created.
Create a class ShowRoom with the attribute as a list of paintings obtained from the main function.
paintingList: of type List of Painting objects.
Define two methods inside ShowRoom class.
getTotalPaintingPrice: It takes a string representing the painting type as argument, and returns the total painting price of the paintings of the given type from the paintingList of the ShowRoom. If no paintings of the given type is present in the list then the method returns None.
getPainterWithMaxCountOfPaintings: It finds the name of the painter from the paintingList of the ShowRoom who has the highest count of Paintings. If more than one painter has the highest count of paintings, the method returns the name of the painter whose name comes first as per the alphabetical orders(A-Z).
Instructions to write the main function:
a. You would require to write the main section completely. Hence please follow the below instructions for the same.
b. You would require to write the main program which is inline to the “sample input description section” mentioned below and to read the data in the same sequence.
c. Create the respective objects(Painting and ShowRoom) with the given sequence of arguments to fulfill the __init__ method as mentioned in requirements, defined to the respective classes referring to the below instructions.
- i) Create a list of Painting objects which will be passes as argument while calling the functions in main. To create the list,
- a. Read a number for the count of Painting objects to be created and added to the list.
- b. Create a Painting object after reading the data related to it and add the objects to the list to be created. This points repeats for the number of Paintings object to be created(considered in the first line of input) as per point #c.i.a
- ii) Create the ShowRoom object by passing the list created in point #c.i
d. Read a value for painting type to be passed as argument to the method getTotalPaintingPrice.
e. Call the method getTotalPaintingPrice by passing the value read in point #d.
f. Call the method getPainterWithMaxCountOfPaintings.
g. Display the value returned by the method getTotalPaintingPrice. If function return None,Then display “Painting not found”(excluding the quotes).
h. Display the value returned by the method getPainterWithMaxCountOfPaintings.
You can use/refer the below-given sample input and output for more details of the format for input and output.
Sample Input description:
a) First line represents the integer value which represents the number of Painting objects.
b) Next lines of input represents one Painting specific data as below one by one in each line.
paintingId paintingName paintingPrice paintingType
c) The points #b repeats for the number of objects mentioned in the point #a.
d) The last line of input is the painting type to be passed as argument to the method getTotalPaintingPrice.
Consider Case Insensitive for this problem statement.
Consider below sample input and output to verify your implementations:
Sample test case 1 : input:
5 101 Raman 50000 portrait 102 kamaal 30000 portrait 103 Raman 25600 modern 104 sumiran 31000 landscape 105 sumiran 50000 Modern Modern
Sample test case 1: output:
75600 raman
Sample test case 2 : input:
5 101 Raman 50000 portrait 102 kamaal 30000 portrait 103 ankit 25600 modern 104 sumiran 31000 landscape 105 sumiran 50000 Modern portrait
Sample test case 2 : output:
80000 sumiran
Now, Let’s see the Solution:
# Create a Painting class class Painting: # Create a constructor method """ pid for paintingID pname for painterName pprice for paintingPrice ptype for painting type """ def __init__(self, arg1, arg2, arg3, arg4): self.pid = arg1 self.pname = arg2 self.pprice = arg3 self.ptype = arg4 # Create a ShowRoom class class ShowRoom : # Create a constructor method # plist for paintingList def __init__(self, arg1): self.plist = arg1 # Define method for this class """ It takes a string representing the painting type as argument, and returns the total painting price of the paintings of the given type from the paintingList of the ShowRoom. If no paintings of the given type is present in the list then method returns None. """ def getTotalPaintingPrice(self, ptype) : tprice = 0 flag = 0 for obj in self.plist : if obj.ptype == ptype : flag = 1 tprice += obj.pprice if flag : return tprice return None # Define method for this class """ It finds the name of the painter from the paintingList of the ShowRoom who has the highest count of Paintings. If more than one painter has highest count of paintings, method returns that name of the painter whose name comes first as per the alphabetical orders(A-Z). """ def getPainterWithMaxCountOfPaintings(self) : nameCount = {} rslt = [] for obj in self.plist : if obj.pname in nameCount: nameCount[obj.pname] += 1 else : nameCount[obj.pname] = 1 # sort a dictionary based on values # returns list of tuples of key,value sort = sorted(nameCount.items(), key = lambda x : x[1]) # takes last tuple element 2nd value val = sort[-1][1] """ If more than one painter has highest count of paintings, method returns that name of the painter whose name comes first as per the alphabetical orders(A-Z). """ for value in sort : if val == value[1]: rslt.append(value[0]) if len(rslt) > 1 : rslt.sort() return rslt[0] else : return sort[-1][0] # main program starts here if __name__ == "__main__" : # take input for number # of Painting object created n = int(input()) # take empty list plist = [] # take values for particular object for val in range(n) : # case insensitiveness consider val1 = input().lower() val2 = input().lower() val3 = int(input()) val4 = input().lower() # create a object with initial value pobj = Painting(val1, val2, val3, val4) plist.append(pobj) # create a object with initial value sobj = ShowRoom(plist) ptype = input().lower() # method called rslt = sobj.getTotalPaintingPrice(ptype) if rslt : print(rslt) else : print("Painting not found") # method called rslt = sobj.getPainterWithMaxCountOfPaintings() print(rslt)
Thanks for reading this blog.
If you find this post useful please share in your groups because Sharing is Caring.
If you have any doubts in understanding the above Code or Question then please comment below, we will try to clear your doubts.
in case 1, raman and sumiran both have highest number of paintings – 2 each but output1 has raman only…
What is correct? raman only or raman and sumiran together?
### SIMPLE SOLUTION ###
class Painting:
def __init__(self, pid, pName, pPrice, pType):
self.pid=pid
self.pName=pName
self.pPrice=pPrice
self.pType = pType
class ShowRoom:
def __init__(self, pList):
self.pList=pList
def getTotalPaintingPrice(self, pType):
self.pType=pType
total = 0
for i in self.pList:
if i.pType==self.pType:
total = total + i.pPrice
return total
def getPainterWithMaxCountOfPaintings(self):
p=self.pList
list1=[]
for i in p:
list1.append(i.pName)
return max(list1, key=list1.count)
if __name__ == ‘__main__’:
n=int(input())
pList=[]
for i in range(n):
pid=input()
pName=input()
pPrice=int(input())
pType=input()
paint = Painting(pid, pName, pPrice, pType)
pList.append(paint)
obj2=ShowRoom(pList)
pType=input()
result=obj2.getTotalPaintingPrice(pType)
if result:
print(‘Total Price:’, result)
else:
print(‘Painting Not Found’)
rslt = obj2.getPainterWithMaxCountOfPaintings()
print(rslt)
def getPainterWithMaxCountOfPaintings(self) :
nameCount = {}
rslt = []
for obj in self.plist :
if obj.pname in nameCount:
nameCount[obj.pname] += 1
else :
nameCount[obj.pname] = 1
# sort a dictionary based on values
# returns list of tuples of key,value
sort = sorted(nameCount.items(), key = lambda x : x[1])
# takes last tuple element 2nd value
val = sort[-1][1]
“””
If more than one painter has highest
count of paintings, method returns that
name of the painter whose name comes first
as per the alphabetical orders(A-Z).
“””
for value in sort :
if val == value[1]:
return value[0]
#rslt.append(value[0])
“””
if len(rslt) > 1 :
rslt.sort()
return rslt[0]
else :
return sort[-1][0]
“””