类变量在for循环中保持为空

2024-04-24 01:29:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想确保hotel_name不存在于Hotel.hotels列表中。 似乎每次我开始喂食for loop时,都会看到一个空列表。你知道吗

注意如果我没有使用for循环

Hotel.hotels.append([number,hotel_name,city,total_number,empty_rooms])

打印酒店名单

[[1, 'Crown Plaza', 'alex', 20, 2], [1, 'Crown Plaza', 'alex', 20, 2], [2, 'Radisson Blu', 'cairo', 24, 22], [3, 'Paradise Inn', 'dubai', 390, 200], [4, 'Four Seasons', 'alex', 1000, 400], [5, 'Address', 'dubai', 500, 200], [6, 'Fairmont', 'dubai', 1000, 100], [7, 'Rotana', 'dubai', 5000, 300]]
[Finished in 0.1s]

这是文件

class Hotel():
    """""""""
    this is hotel class file
    """
    hotels = []

    def __init__(self,number,hotel_name,city,total_number,empty_rooms):
        self.number = number
        self.hotel_name = hotel_name
        self.city = city
        self.total_number = total_number
        self.empty_rooms = empty_rooms
        for i in Hotel.hotels:
            if self.hotel_name not in i:
                Hotel.hotels.append([number,hotel_name,city,total_number,empty_rooms])
            # else:
            #     print "Hotel already exists!"

feed_dataBase_with_hotel = Hotel(1,"Crown Plaza","alex",20,2)
feed_dataBase_with_hotel = Hotel(1,"Crown Plaza","alex",20,2)# cull repeated
feed_dataBase_with_hotel = Hotel(2,"Radisson Blu","cairo",24,22)
feed_dataBase_with_hotel = Hotel(3,"Paradise Inn","dubai",390,200)
feed_dataBase_with_hotel = Hotel(4,"Four Seasons","alex",1000,400)
feed_dataBase_with_hotel = Hotel(5,"Address","dubai",500,200)
feed_dataBase_with_hotel = Hotel(6,"Fairmont","dubai",1000,100)
feed_dataBase_with_hotel = Hotel(7,"Rotana","dubai",5000,300)

print Hotel.hotels

非常感谢帕特里克的回答 更新 如果我想从dict构建一个列表,因为我想访问空房间并用另一个类更改它的值,该怎么办

class Hotel():
    """
    this is hotel class file
    """
    hotels = {}
    hotelList = []

    def __init__(self,number,hotel_name,city,total_number,empty_rooms):
        self.number = number
        self.hotel_name = hotel_name
        self.city = city
        self.total_number = total_number
        self.empty_rooms = empty_rooms

        # edited: no for needed
        if self.hotel_name in Hotel.hotels:
            print('Hotel {} Already exists!'.format(self.hotel_name))
            return # or raise ValueError & handle it

        Hotel.hotels[self.hotel_name] = self

        tempList = Hotel.hotels.items()
        for i in tempList:
            x = Hotel.hotels.items()[i][1]
            Hotel.hotelList.append(x)

更新

另一个预订类将使用我们在hotel类中使用的实例变量hotel\ u name

from hotel import Hotel
from customer import Customer
from notification import Notification

class Reservation():
    reservations =[]
    def reserve_room(self,hotel_name, customer_name):
        x = Hotel.hotels.values()
        for i in x:
            if Hotel.hotel_name in i:
                Reservation.reservations.append([hotel_name,customer_name])
                i[4] -=1

AttributeError:class Hotel没有“Hotel\u name”属性

更新 从Understanding getitem method 使用

def __getitem__(self, hotel_name):
          return self.hotel_name

问题解决!

特别感谢Patrick


Tags: nameinselfnumbercityfeedwithhotel
3条回答

问题是,在遍历空的“hotels”列表时,需要使用.append。 首先检查for循环中现有的hotel\u名称,然后追加。你知道吗

for hotel in self.hotels:
    if self.hotel_name == hotel[1]:  # hotel_name is at index 1
        print('Already exists!')
        return  # return before appending
#now append
self.hotels.append([number,hotel_name,city,total_number,empty_rooms])

如果你不想回来,试试这个

for hotel in self.hotels:
    if self.hotel_name == hotel[1]:  # hotel_name is at index 1
        print('Already exists!')
        break
else:  # break did not happen
    self.hotels.append([number,hotel_name,city,total_number,empty_rooms])

我建议改变一些东西来解决它:

  • 您正在迭代一个可能有1000个Hotel的列表,以查找其中是否有一个同名的,如果您使用setdict作为O(1)中的查找,效果会更好。ListO(n)查找最坏情况的时间,这意味着set/dict是常数时间,不管你有多少Hotel。列表越来越慢,需要搜索的Hotel越多。

  • 用新的Hotel实例覆盖同一个变量,它们自己就会被创建和遗忘—只在Hotel.hotels列表中存储它们的值,而不是存储构建的Hotel本身。Hotel实例的整个构造是毫无意义的。

提议的变更:

  • 使静态存储成为一个字典,这样可以使您获得快速查找的好处
  • 存储您的Hotel实例,而不是使用创建的值Hotel
  • 不要直接打印Hotel.hotelDict—我介绍了一种只接受dici值并按顺序打印的方法—默认情况下,我按Hotel.number排序

class Hotel():
    """""""""
    this is hotel class file
    """   
    hotelDict = {} # checking "in" for sets is much faster then list - a dict is similar
                   # fast in checking and can hold values - serves double duty here
    # sorted hotels by value, sorted by key

    @classmethod
    def getSortedHotels(cls, sortKey = lambda x:x.number):
        """Takes all values (Hotel's) from Hotel.hotelDict
        and prints them after sorting. Default sort key is Hotel.number"""
        return sorted(cls.hotelDict.values(), key=sortKey) 

    def __init__(self,number,hotel_name,city,total_number,empty_rooms):
        if hotel_name in Hotel.hotelDict:
            print("Hotel already exists: {}".format(hotel_name))
            return # or raise ValueError("Hotel already exists") and handle the error
# see https://stackoverflow.com/questions/3209233/how-to-replace-an-instance-in-init
# if you want to try to replace it using __new__() but not sure if its possible

        self.number = number
        self.hotel_name = hotel_name
        self.city = city
        self.total_number = total_number
        self.empty_rooms = empty_rooms
        Hotel.hotelDict[self.hotel_name] = self

    def __repr__(self):
        """Neater print output when printing them inside a list"""
        return "{:>3}) {} in {} has {} of wich {} are empty.".format(
        self.number,self.hotel_name,self.city,self.total_number,self.empty_rooms)
        # if you want a "simple" list-like output of your attributes:
        # comment the return above and uncomment:
        # return repr([self.number,self.hotel_name,self.city,
        #              self.total_number,self.empty_rooms])

    def __str__(self):
        """Neater print output when printing Hotel instances"""
        return self.__repr__()

测试方法:

feed_dataBase_with_hotel = Hotel(1,"Crown Plaza","alex",20,2)
feed_dataBase_with_hotel = Hotel(1,"Crown Plaza","alex",20,2) # cull repeated
feed_dataBase_with_hotel = Hotel(2,"Radisson Blu","cairo",24,22)
feed_dataBase_with_hotel = Hotel(3,"Paradise Inn","dubai",390,200)
feed_dataBase_with_hotel = Hotel(4,"Four Seasons","alex",1000,400)
feed_dataBase_with_hotel = Hotel(5,"Address","dubai",500,200)
feed_dataBase_with_hotel = Hotel(6,"Fairmont","dubai",1000,100)
feed_dataBase_with_hotel = Hotel(7,"Rotana","dubai",5000,300)

print Hotel.getSortedHotels() 

print Hotel(99,"NoWayInn","NoWhere",1,200)

输出:

Hotel already exists: Crown Plaza
[  1) Crown Plaza in alex has 20 of wich 2 are empty.,   
   2) Radisson Blu in cairo has 24 of wich 22 are empty.,   
   3) Paradise Inn in dubai has 390 of wich 200 are empty.,   
   4) Four Seasons in alex has 1000 of wich 400 are empty.,   
   5) Address in dubai has 500 of wich 200 are empty.,   
   6) Fairmont in dubai has 1000 of wich 100 are empty.,   
   7) Rotana in dubai has 5000 of wich 300 are empty.]

 99) NoWayInn in NoWhere has 1 of wich 200 are empty.

如果您希望您的酒店按名称排序,请简单:

print Hotel.getSortedHotels(sortKey=lambda x:x.hotel_name)

请看这一行酒店:这里

for i in Hotel.hotels:
    if self.hotel_name not in i:
          Hotel.hotels.append([number,hotel_name,city,total_number,empty_rooms])

然后试着在这种情况下它会填满你的数组

相关问题 更多 >