python检查关键字是否已在字典中



我正试图在OOP中创建一个停车场。我想检查一下字典里有没有钥匙。例如,我不想在我的字典中使用相同的"车牌号"。

我正在使用命令:

if plate in p1.carsAndEnterTime:
print("This plate number already exists in the system")
plate = input("Please enter the plate number:n")

但它没有找到任何钥匙。

这是我的完整代码:

class Cars:
def __init__(self, phone, car_type, plate):
self.__phone = phone
self.__car_type = car_type
self.__plate = plate
def __repr__(self):
return f"{self.__plate}, {self.__phone}, {self.__car_type}"
def __str__(self):
return f"{self.__plate}, {self.__phone}, {self.__car_type}"

class ParkingLot:
def __init__(self, name, capacity=1):
''' return a ParkingLot object with name "name" '''
self.name = name
self.capacity = capacity
self.earnings = 0
self.rate = 15
self.carsAndEnterTime = {}
def SetCapacity(self, newCap):
''' change the capacity from the default 1 '''
if newCap < 1:
raise RuntimeError("Error: parking lot size cannot be less than 1")
self.capacity = newCap
def GetCapacity(self):
''' return parking lot capacity '''
return self.capacity
def GetEarnings(self):
''' return how much much parking has made '''
return self.earnings
def VehicleEnters(self, vehicle):
''' vehicle enters parking lot'''
# put car and its enter time in a dictionary
self.carsAndEnterTime[vehicle] = datetime.datetime.now()
if self.capacity == 0:
raise RuntimeError("Error: Parking lot full!")
self.capacity -= 1
def SetSecondlyRate(self, rate=20):
self.rate = rate
def VehicleLeaves(self, vehicle):
''' vehicle leaves parking lot. when it leaves, charges money '''
secondsDiff = datetime.datetime.now() - self.carsAndEnterTime[vehicle]
hour_roundup = math.ceil(secondsDiff.seconds / 3600)
self.earnings += self.rate * hour_roundup
# after earned money, delete vehicle from dictionary
del self.carsAndEnterTime[vehicle]
self.capacity += 1

当我执行以下操作时:

>>> p1 = ParkingLot(p1,2)
>>> plate = 12345
>>> car_type = "Public"
>>> phone = "05555555"
>>> c = c1 = Cars(plate, car_type, phone)

当我试着检查dict里面的palte但它忽略了,尽管存在格言。

if plate in p1.carsAndEnterTime:
print("This plate number already exists in the system")
plate = input("Please enter the plate number:n")

例如,我打印我的dict:你可以在我的字典里看到12345。

>>>print(p1.carsAndEnterTime)
{12345, 55555, p: datetime.datetime(2020, 5, 10, 23, 0, 36, 557859), 12345, 5555, p: datetime.datetime(2020, 5, 10, 23, 0, 44, 568150)}

我做错了什么?我该如何解决?

您不按车牌将汽车放入停车场,而是将完整的汽车实例放入字典。如果放入两个具有相同值的不同汽车实例,则id(car1)id(car2)会因为两个不同的对象而不同。因此没有平等。

一个粗略的方法是检查:

def CarAlreadyParked(self, vehicle):
"""Returns true if the exact car is already parked."""
return any(str(c) == str(vehicle) for c in self.carsAndEnterTime)

在让车进去之前-可能是一辆伪造身份的车。总而言之,最好重新设计,也许把车放在那里的车牌旁

dict [ PlateNr] = (VehicleInstance, CheckinTime)

因此您可以通过plateNr快速找到它们,并将车辆对象放在值的元组中

最新更新