【问题标题】:TypeError: 'apartment' object is not subscriptableTypeError:“公寓”对象不可下标
【发布时间】:2020-01-13 05:17:32
【问题描述】:

这是我要解决的问题。 创建一个名为 apartment 的类,其属性为 flatnumber、所有者名称、电费金额。使用 def init(self):pass 创建另一个类 apartment_demo 以创建一个方法 getSecondMinBill,该方法获取对象列表并给出第二个最小电费作为输出。

Input:3(no.of objects to be created)
1000
Hari
5000
1001
Hena
5002
1002
Harsha
5001
Output:5001

这是我的代码

class apartment:
    def __init__(self,flat_no,owner_name,ele_bill):
        self.flatnumber=flat_no
        self.owner_name=owner_name
        self.ele_bill_amount=ele_bill

class apartment_demo(apartment):
    def __init__(self):
        pass
    def get_second_min(self):
        list=[]
        a=int(input())
        for i in range(a):
            f=int(input())
            o=str(input())
            e=int(input())
            list.append(apartment(f,o,e))
        l=len(list)
        #print(self.ele_bill_amount for i in list)
        for i in range(0,l):
            for j in range(0,l-i-1):
                if list[j][2]>list[j+1][2]:
                    temp=list[j][2]
                    list[j][2]=list[j+1][2]
                    list[j+1][2]=temp
        print(list[1][2])
        #print("Flat no:",self.flatnumber,"Owner 
        #name:",self.owner_name,"Ele.bill:",self.ele_bill_amount)

a=apartment_demo()
a.get_second_min()    

这是我遇到的错误

if list[j][2]>list[j+1][2]:
TypeError: 'apartment' object is not subscriptable

【问题讨论】:

  • list[j] 返回您的 apartment 类的实例;我们称之为apt1。那么当您请求apt1[2] 的值时,您希望返回什么?哦,尽量不要将变量命名为与内置变量相同。

标签: python python-3.x


【解决方案1】:

你的代码很难破译,所以我把它清理了一下,以便更易读。首先,您不应该使用受限词作为变量名,例如List,因为这可能会导致一些问题。接下来,不需要继承 apartment 类,因为您没有使用它的任何方法。此外,您不必将姓名输入转换为字符串,因为输入已经是字符串。最后,你找到第二大账单的方法很难阅读,所以我创建了一个不同的方法。下面是代码。

    def __init__(self,flat_no,owner_name,ele_bill):
        self.flatnumber=flat_no
        self.owner_name=owner_name
        self.ele_bill_amount=ele_bill

class apartment_demo:
    def __init__(self):
        pass
    def get_second_min(self):
        obj_list=[]
        bill_list =[]
        a=int(input())
        for i in range(a):
            f=int(input())
            o=input()
            e=int(input())
            obj_list.append(apartment(f,o,e))
        for i in obj_list:
          bill_list.append(i.ele_bill_amount)
        max_bill = max(bill_list)
        while True:
          bill_list.remove(max_bill)
          if max_bill not in bill_list:
            second_largest = max(bill_list)
            print("The second largest bill is " + str(second_largest))
            break
        #print("Flat no:",self.flatnumber,"Owner 
        #name:",self.owner_name,"Ele.bill:",self.ele_bill_amount)

a=apartment_demo()
a.get_second_min()  

这里发生的情况是,我将每个对象附加到 obj_list,我从 list 重命名为更清楚。然后,我创建了一个新列表来存储我称之为bill_list 的每间公寓的账单。从那里,我使用了max() 函数,该函数将列表作为输入并返回该列表中的最大值。然后,我使用了一个 while 循环来删除使用 .remove(max_bill) 的最大账单。然后我使用if max_bill not in bill_list: 检查最大的账单是否仍在列表中。如果此条件为真,我只需再次调用max() 以返回列表中的下一个最大值。这将是您的第二大账单。如果条件为假,while 循环将再次迭代并删除最大的账单。

【讨论】:

    【解决方案2】:

    您可以使用如下所示的内容,只需对您的代码进行少量更改 -

    
    class apartment():
        def __init__(self,flat_no,owner_name,ele_bill):
            self.flatnumber=flat_no
            self.owner_name=owner_name
            self.ele_bill_amount=ele_bill
    
        def getAttr(self):
            return [self.flatnumber, self.owner_name, self.ele_bill_amount]
    
    class apartment_demo(apartment):
        def __init__(self):
            pass
        def get_second_min(self):
            print('inside')
            list=[]
            a=int(input('Num: '))
            for i in range(a):
                f=int(input('flat no: '))
                o=str(input('owner name: '))
                e=int(input('elect bill: '))
                a = apartment(f,o,e)
                list.append(a.getAttr())
            l=len(list)
            #print(self.ele_bill_amount for i in list)
            for i in range(0,l):
                for j in range(0,l-i-1):
                    if list[j][2]>list[j+1][2]:
                        temp=list[j][2]
                        list[j][2]=list[j+1][2]
                        list[j+1][2]=temp
            print(list[1][2])
            #print("Flat no:",self.flatnumber,"Owner 
            #name:",self.owner_name,"Ele.bill:",self.ele_bill_amount)
    
    a=apartment_demo()
    a.get_second_min()
    
    

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 2017-07-15
      • 2021-10-01
      • 2019-12-07
      • 2012-01-09
      • 2021-11-23
      • 2012-02-21
      • 2018-08-07
      相关资源
      最近更新 更多