忽略条件的后续实例(for循环和if语句)

时间:2015-02-26 19:45:54

标签: python python-2.7 if-statement for-loop

我之前发布了一些关于索引超出范围错误的代码;但是,在我解决了这个错误之后,我意识到获取必要信息的过程存在缺陷。

我在Python中编写了一个for循环,用于在标识符匹配并且对另一个参数发生重大更改时搜索实例的数据文件。当该实例发生时,相关数据将输出到文本文件。我忽略了意识到我想忽略同一条件的任何后续事件。我只想记录第一次出现,然后继续浏览文件,直到出现不同标识符的情况,继续进行直到文件结束。

输入数据如下所示:

  

0000 0.0000000000 185263.9890 105232.4887 0.0000000000 345.0928095 0.2982502454

     

0001 0.0000000000 185163.8872 105235.6420 0.0000000000 344.4662790 0.5691114931

     

0001 218.1599792 185187.4241 105332.8326 100.0000000 30.21264632 0.4583792149

     

0001 2070.891273 185259.6501 105401.9948 200.0000000 342.4030385 0.05397436763

     

0002 0.0000000000 185073.8381 105257.5082 0.0000000000 289.0103714 0.1765702856

     

0002 548.7104537 185007.5650 105182.6224 100.0000000 283.1207050 0.1822454800

     

0002 4339.891390 184907.6061 105179.7550 200.0000000 235.0171868 0.02637700539

     

0003 0.0000000000 185044.6468 105355.0609 0.0000000000 141.5931561 0.5491341407

     

0004 0.0000000000 185037.7703 105455.3306 0.0000000000 148.8916916 0.9710776916

     

0004 140.8620875 185106.3138 105382.5172 100.0000000 122.1786717 0.7099142273

     

0004 602.2794100 185206.2952 105384.4448 200.0000000 96.31412264 0.2167235496

     

0004 2841.576352 185251.6140 105424.2290 260.3040892 139.3786179 0.02692992078

     

0005 0.0000000000 185879.1193 105481.7119 0.0000000000 240.1629722 0.1176913655

     

0005 155.2441594 185779.6779 105492.2674 100.0000000 289.7377882 0.6441466166

     

0005 305.7366429 185688.7618 105533.9118 200.0000000 296.1130146 0.6644850139

     

0005 632.1957592 185600.2198 105580.3909 300.0000000 298.9600016 0.3063170700

     

0005 889.3161045 185516.5649 105549.4496 389.1936581 32.05095338 0.3468945953

     

0005 1114.532354 185538.1521 105576.9088 424.1223441 8.425251603 0.1550895465

     

0005 1282.115239 185545.3480 105477.1680 524.1223441 3.718447942 0.5967196476

每行中的第一项是标识符。每行的第三项和第四项是坐标点。每行中的第六项是方向角度值(这是感兴趣的参数)。目标是找到具有相同标识符的两条线,并比较方向角度值以进行显着变化(在这种情况下大于90度),然后记录标识符和坐标点。例如:

  

0001 0.0000000000 185163.8872 105235.6420 0.0000000000 344.4662790 0.5691114931

     

0001 218.1599792 185187.4241 105332.8326 100.0000000 30.21264632 0.4583792149

在这两行中,标识符0001匹配,方向角度变化超过90度。此条件由for循环中的if语句标记,标识符和坐标点输出到文本文件。我有这个过程。但...

  

0001 0.0000000000 185163.8872 105235.6420 0.0000000000 344.4662790 0.5691114931

     

0001 218.1599792 185187.4241 105332.8326 100.0000000 30.21264632 0.4583792149

     

0001 2070.891273 185259.6501 105401.9948 200.0000000 342.4030385 0.05397436763

序列中的第三行也匹配标识符AND的方向角度变化大于90度,因此它也会被条件语句标记并记录到输出文件中。我想忽略条件的任何重复实例,只记录第一次出现。

另外,我想在比较两条线没有匹配标识符的情况下标记和记录坐标数据,但我认为我可以将其作为if / else组合与其他条件的一部分来处理。更重要的是能够忽略已经标记和记录的标识符的方向角度变化大于90度的重复出现。由于大多不熟悉Python(以及一般的编程),我似乎无法找到适用于此场景的现有解决方案。我不一定在寻找复杂的解决方案。我只需要捕获一组特定的数据,以便在ArcGIS项目中重用。

感谢您的建议。

line1 = trackdata.readline()
line2 = trackdata.readline()

for i in range(l-1):

    file_no1 = line1.split()[0]
    time1 = line1.split()[1]
    x1 = line1.split()[2]
    y1 = line1.split()[3]
    length1 = line1.split()[4]
    flow_dir1 = float(line1.split()[5])
    flow_mag1 = line1.split()[6]

    file_no2 = line2.split()[0]
    time2 = line2.split()[1]
    x2 = line2.split()[2]
    y2 = line2.split()[3]
    length2 = line2.split()[4]
    flow_dir2 = float(line2.split()[5])
    flow_mag2 = line2.split()[6]

    if file_no1 == file_no2:
        if abs(flow_dir2 - flow_dir1) > 90.0:
            print >> coordinates1, file_no1, x1, y1

    line1 = line2
    line2 = trackdata.readline()

2 个答案:

答案 0 :(得分:1)

你可以试试这样的事情;

if file_no1 == file_no2:
    if abs(flow_dir2 - flow_dir1) > 90.0:
        print >> coordinates1, file_no1, x1, y1
        tempLine = trackdata.readline() # grabs next line
        temp_no = tempLine.split()[0] # grabs file id
        while temp_no == file_no1: # runs while its the same as the file
                                   #  id that gave us the condition
            tempLine = trackdata.readline()
            temp_no = tempLine.split()[0]
        line1 = tempLine                # set new lines
        line2 = trackdata.readline()

if file_no1 = line1.split()[0]:
    line1 = line2
    line2 = trackdata.readline()

这里要检查的是确保你没有尝试读取文件末尾,所以你需要添加检查

答案 1 :(得分:0)

只需保留一份您见过的值的备忘录

line1 = trackdata.readline()
line2 = trackdata.readline()

memo = set()

for i in range(l-1):

    file_no1 = line1.split()[0]
    time1 = line1.split()[1]
    x1 = line1.split()[2]
    y1 = line1.split()[3]
    length1 = line1.split()[4]
    flow_dir1 = float(line1.split()[5])
    flow_mag1 = line1.split()[6]

    file_no2 = line2.split()[0]
    time2 = line2.split()[1]
    x2 = line2.split()[2]
    y2 = line2.split()[3]
    length2 = line2.split()[4]
    flow_dir2 = float(line2.split()[5])
    flow_mag2 = line2.split()[6]

    if file_no1 == file_no2:
        val = abs(flow_dir2 - flow_dir1)
        if val > 90.0 and val not in memo:
            memo.add(val)
            print >> coordinates1, file_no1, x1, y1

    line1 = line2
    line2 = trackdata.readline()