Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于环路&;如果在字典里_Python_Python 3.x_If Statement_For Loop_Dictionary - Fatal编程技术网

Python 用于环路&;如果在字典里

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

注意:我是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 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上进行了测试)。