首页 > 解决方案 > 我如何创建一个行列表直到一个单词在行中,然后再次开始一个新的行列表直到一个单词

问题描述

我有一个包含坐标线的文件

L1A  10.73  -36.14
L1B  15.30  -54.70
Segment
L2A  17.03  -43.80
L2B  17.90  -49.55
L4A  03.00  -54.00
Segment
L3A  07.80  -36.00
L3B  03.00  -36.00

我想要做的是我想创建一个列表的词段之间的行

所以 L1A 和 L1B 将是一个列表,L2A L2B L4A 将是第二个列表,等等......

那么我如何创建一个循环或其他东西,以便它附加一个列表直到它到达单词'Segment',然后它打开一个新列表并附加到下一个单词'Segment'等等。

第一个列表将命名为 coords1,第二个 coords2,.... coordsn

这就是我所拥有的,但这只会不断更新“坐标”,而不是停在“段”并打开一个新的坐标列表......

coord = []
with open('kml_coastrica.txt', 'r') as f:
    for line in f:
        if not 'Segment' in line:
            newline = line.split('  ')
            lon = int(newline[1])
            lat = int(newline[2])
            coords.append([lat,lon])

标签: python-3.x

解决方案


您的问题是您始终将内部列表附加到同一个列表 - 您需要更多的嵌套级别:

  1. 创建列表列表,
  2. 迭代你的文件行,
    1. 将线分成坐标(我认为您将它们按顺序混合,请检查)
    2. 将每个坐标添加到列表中
  3. 将每个行列表添加到结果的最后一个内部列表
  4. 如果你打了一个新的'Segment'- 在你的结果中添加一个新的内部列表
  5. 继续直到完成:

创建文件:

with open("t.txt","w") as f:
    f.write("""L1A  10.73  -36.14
L1B  15.30  -54.70
Segment
L2A  17.03  -43.80
L2B  17.90  -49.55
L4A  03.00  -54.00
Segment
L3A  07.80  -36.00
L3B  03.00  -36.00
""")

处理文件:

result = [[]]                 # start with an empty inner list
with open("t.txt") as f:
    for line in f:
        if line.strip() == "Segment":
            result.append([])           # add new empty list at end
        else:
            data = line.strip().split()
            lon = float(data[1])        # you need floats - not int's
            lat = float(data[2])        # same here: floats

            # add data point to last inner list
            result[-1].append([lat,lon]) # I think you got them mixed here ?

print(result)

输出:

[[[-36.14, 10.73], [-54.7, 15.3]], 
 [[-43.8, 17.03], [-49.55, 17.9], 
  [-54.0, 3.0]], [[-36.0, 7.8], [-36.0, 3.0]]]

如果您的数据因最后一个列表元素而停止,则该'Segment'元素将为空。


推荐阅读