Python 用于环路&;如果在字典里
注意:我是Python新手 我的任务是设计一个程序,输出10个车牌(英国和外国的混合)中的外国车牌,但前提是它们正在加速。我在这一过程中犯了一些错误,我不确定如何解决这些问题#UK和#F只是我的笔记,让我能够快速查看哪个是英国车牌,哪个是外国车牌Python 用于环路&;如果在字典里,python,python-3.x,if-statement,for-loop,dictionary,Python,Python 3.x,If Statement,For Loop,Dictionary,注意:我是Python新手 我的任务是设计一个程序,输出10个车牌(英国和外国的混合)中的外国车牌,但前提是它们正在加速。我在这一过程中犯了一些错误,我不确定如何解决这些问题#UK和#F只是我的笔记,让我能够快速查看哪个是英国车牌,哪个是外国车牌 import re distance=750 #variable for the distance between the Camera A and B (in m) speedlimit=60 # (mps) NumberPlates=["DV61
import re
distance=750 #variable for the distance between the Camera A and B (in m)
speedlimit=60 # (mps)
NumberPlates=["DV61 GGB",#UK
"D3S11 EUBG 20",#F
"5T314 10A02",#F
"24TEG 5063",#F
"TR09 TRE",#UK
"524 WAL 75",#F
"TR44 VCZ",#UK
"FR52 SWD",#UK
"100 GBS 12",#F
"HG55 BPO"#UK
]
Enter=[7.12,7.17,7.20,7.45,7.23,7.33,7.18,7.25,7.33,7.38]
#A list for the times of cars passing Camera A
Leave=[7.56,7.24,7.48,7.52,7.45,7.57,7.22,7.31,7.37,7.47]
#A list for the times of cars passing Camera B
Timestaken=[]
Timestaken2=[]
Timestaken3={}
for enter_data, leave_data in zip(Enter, Leave):
Timestaken.append(leave_data-enter_data)
Timestaken=["%.2f" % (leave_data-enter_data) for enter_data, leave_data in zip(Enter, Leave)]
Timestaken2=[s.strip("0") for s in Timestaken]
Timestaken2=[s.strip('.') for s in Timestaken2]
for key,value in zip(NumberPlates,Timestaken2):
Timestaken3[key]=value
print(Timestaken3)
for item in NumberPlates:
UK_Numbers=list(filter(lambda x: re.match("[A-Z]{2}\d{2}\s+[A-Z]{3}$",x),NumberPlates))
for item in UK_Numbers:
if item in UK_Numbers:
NumberPlates.remove(item)
print(NumberPlates) #These are foreign number plates only.
Timestaken4={}
for key,value in zip(NumberPlates,Timestaken2):
Timestaken4[key]=value
print(Timestaken4) #NumberPlate:Time
print("10 cars have passed Camera A, then Camera B\n")
for key,value in Timestaken4.items():
speed=distance/int(value)
if speed>speedlimit:
print(key,"is speeding with",distance/int(value),"mps")
我得到这个输出:
>>>
{'5T314 10A02': '28', '100 GBS 12': '04', '524 WAL 75': '24', 'D3S11 EUBG 20': '07', '24TEG 5063': '07', 'HG55 BPO': '09', 'TR44 VCZ': '04', 'TR09 TRE': '22', 'DV61 GGB': '44', 'FR52 SWD': '06'}
['D3S11 EUBG 20', '5T314 10A02', '24TEG 5063', '524 WAL 75', '100 GBS 12']
{'5T314 10A02': '07', '100 GBS 12': '22', '524 WAL 75': '07', '24TEG 5063': '28', 'D3S11 EUBG 20': '44'}
10 cars have passed Camera A, then Camera B
5T314 10A02 is speeding with 107.14285714285714 mps
524 WAL 75 is speeding with 107.14285714285714 mps
最后两条线路应该有不同的速度。我意识到进入和离开时间所带来的速度是不人道的,但这不是我的问题
第三条输出线显示时间分配给不同的车牌。我正在寻找一种方法来解决这个问题
最后两行输出与以下内容有关:
for key,value in Timestaken4.items():
speed=distance/int(value)
if speed>speedlimit:
print(key,"is speeding with",distance/int(value),"mps")
除了分配给不同号码牌的时间外,我如何修改代码以使其显示正确的速度?以下是我解决问题的方法
from datetime import datetime
distance = 750
speed_limit = 60
camera_a = {
"DV61 GGB": 7.12,
"D3S11 EUBG 20": 7.17,
}
camera_b = {
"DV61 GGB": 7.56,
"D3S11 EUBG 20": 7.24,
}
def velocity(a, b):
entry = datetime.strptime(str(a), '%M.%S')
exit = datetime.strptime(str(b), '%M.%S')
elapsed_time_in_seconds = (exit - entry).total_seconds()
velocity_mph = (distance / elapsed_time_in_seconds) / (1609.44/3600)
return velocity_mph
for number_plate, t in camera_a.iteritems():
if number_plate in camera_b.keys():
velocity_mph = velocity(t, camera_b[number_plate])
if velocity_mph > speed_limit:
print '%s was speeding: %.2f mp/h' % (number_plate, velocity_mph)
首先,我会使用字典而不是列表来存储来自摄像机的数据。这会让事情变得更简单(如果其中一辆车超过另一辆车,并且打乱了列表的顺序,你也不会有问题)。我不需要单独列出车牌号码,因为我可以使用照相/摄像机字典中的钥匙
然后,我会遍历摄像头A的键/值对,检查车牌是否是两个字典中的键(如果摄像头B中缺少该车牌,则意味着该车要么在摄像头之间,要么使用出口离开道路)
velocity函数将摄影机A和B中的值转换为日期时间对象。我假设这些值是分秒格式,并返回汽车的速度,单位为mp/h
最后,我们检查汽车是否超速行驶,并打印出一条信息
在我的示例中,我没有解决您的上一个条件(“输出外部号码牌”)。为了实现这一点,我将创建第二个名为“is_foreign”的函数,该函数将一个号码牌作为输入,并返回True/False,您可以执行以下操作:
import re
# DATA
distance = 750 # Distance between the Camera A and B (in m)
speed_limit = 60 # (mps)
number_plates = ["DV61 GGB", #UK
"D3S11 EUBG 20", #F
"5T314 10A02", #F
"24TEG 5063", #F
"TR09 TRE", #UK
"524 WAL 75", #F
"TR44 VCZ", #UK
"FR52 SWD", #UK
"100 GBS 12", #F
"HG55 BPO" #UK
]
enter = [7.12,7.17,7.20,7.45,7.23,7.33,7.18,7.25,7.33,7.38]
leave = [7.56,7.24,7.48,7.52,7.45,7.57,7.22,7.31,7.37,7.47]
# Find the non-UK plates
pattern = "(?![A-Z]{2}\d{2}\s+[A-Z]{3}$)"
foreign_numbers = list(filter(lambda x: re.match(pattern, x), number_plates))
# Compute speeds
elapsed = [l - e for l, e in zip(leave, enter)]
speed = [distance/t for t in elapsed]
# Conditional dictionary comprehension
foreign_speeders = {plate: speed
for plate, speed in zip(number_plates, speed)
if (plate in foreign_numbers) and (speed > speed_limit)}
foreign_speeders
这使得:
{'100 GBS 12': 18749.99999999998,
'24TEG 5063': 10714.285714285807,
'524 WAL 75': 3124.9999999999973,
'5T314 10A02': 2678.571428571426,
'D3S11 EUBG 20': 10714.28571428567}
您可以设置以下格式:
for plate, speed in foreign_speeders.items():
print("{0:>14s} was speeding at {1:8.1f} m/s".format(plate, speed))
这些单位似乎有问题。我猜速度限制实际上是以英里每小时为单位的。顺便说一句,如果是我,并且有很多数据,我可能会在或者至少在NumPy。。。那么你就不必如此小心地保持所有这些列表的正确顺序和长度。但是这些乐趣可以等到你看到更多的Python之后。我试着以每小时英里为单位工作,但没有成功。我转换了所有的值,使它们符合米/秒单位,但有没有办法将经过的时间取整?经过
后=[l-e代表l,e在zip中(离开,进入)]
,我收到了一些结果,比如D3S11 EUBG 20以2727.3 mps的速度加速
,结果应该是27.2727
等。如果这是个问题,很抱歉,我仍在计算您的代码。而不是l-e
put(l-e)/100
在该列表中。也许距离的单位是厘米?或者时间是几分钟……我想出来了,但是(l-e)/100
也很有用。最后,请您向我解释一下(“{0:>14s}以{1:8.1f}米/秒的速度加速”。格式(车牌,速度))
的作用是什么?这是我第一次遇到这样的方法,我的任务之一就是解释代码的每一部分。我希望你能理解。提前谢谢!读到……我想这比我在这里能解释得更好。我建议在REPL里玩一下,这就解释了。再次感谢您的帮助!这是Python2.7版的吗?是的。(昨天在简化答案时,我在答案中留下了一个愚蠢的错误。我已经纠正了错误,并在python 2.7.10上进行了测试)。