Python - 将列表分离为列表列表

Python - Separating a list into list of lists

提问人:Marcelo Silva 提问时间:11/2/2022 最后编辑:gogMarcelo Silva 更新时间:11/2/2022 访问量:66

问:

第一次问问题,所以为任何错误道歉。

我正在尝试在 Python 中创建一个脚本,该脚本可以从文件夹中读取所有卫星图像文件,仅选择图像文件,然后按传感器对它们进行排序,最后按不同的场景(场景是给定位置和日期时间的一组特定卫星图像)。

到目前为止,我已经使用 glob 来拍摄图像(每个卫星图像由 8-12 个波段组成,因此每个场景有 8-12 个图像),然后使用 for 循环按传感器对它们进行排序,以在命名文件夹中查找名称。

最后一步是查看每个传感器列表,并按场景将它们分开,按名称查看,这样我就可以用 rasterio 打开它们。

到目前为止,我的代码看起来像这样(缩写形式):

# Pick the images I want

sat_bands = glob(path, recursive = True)
sat_bands.sort()

# Set each one according to respective satellite

LC08_list = []
... # Create an empty list for each sensor

for i in sat_bands:
    if "LC08" in i:
        LC08_list.append(i)
    ...  # Do if statements for each sensor

最后,我得到了一个列表,其中包含特定传感器的每个卫星图像波段的路径。 在此示例中,我使用了 2 个 Landsat-8 影像,每个影像有 8 个波段。

命名方案如下所示:

'Dados/Sat_Img\\LC08_L2SP_203033_20200819_20200904_02_T1\\LC08_L2SP_203033_20200819_20200904_02_T1_ST_B10.TIF'
'Dados/Sat_Img\\LC08_L2SP_203033_20200819_20200904_02_T1\\LC08_L2SP_203033_20200819_20200904_02_T1_SR_B3.TIF'
'Dados/Sat_Img\\LC08_L2SP_203033_20201123_20210315_02_T1\\LC08_L2SP_203033_20201123_20210315_02_T1_SR_B7.TIF'

前两个属于同一个场景(它们在同一个子文件夹中,名称几乎相同,除了乐队编号),最后一个来自不同的场景。

使用正则表达式,我知道如果我使用,我会区分每个场景,同时忽略_Band终止。 我想我可以使用某种带有 if 语句的 for 循环将每个场景排序到列表列表中,但是我无法将每个场景索引为嵌套列表。 这是我最成功的尝试的样子:".*_[STR]+?"

创建了两个变量 y 和 z 来循环列表,并创建了 list 和空列表来接收新的嵌套列表。

z = 0
y = 0
L8_sub = list()
L8_ = list()

然后尝试了 for 循环:

for z in range(len(LC08_list)):

    if re.findall(".*_[STR]+?", LC08_list[z]) == re.findall(".*_[STR]+?", LC08_list[y]):

        L8_.append(LC08_list[z])

    else:
        y = z  # So y catches up to the last  if true
        L8_sub.append(LC08_list[z]) # So the "False" statment gets carried over
        L8_.append(LC08_list[z])
    
    L8_.append(L8_sub)  # So I append each list of scenes to the main List for each sensor

此循环创建一个包含 16 个列表(我在 LC08 列表中的文件数量)的L8_列表,每个列表有 8 个字符串(8 个频段,因此它限制了特定场景)。奇怪的是,它实际上是在捕捉场景 2,而不是场景 1......

L8_ = [[scene2_B1, scene2_B2, scene2_B3 ... scene2_B10], ['scene2_B1, scene2_B2, scene2_B3 ... scene2_B10], ...]

预期结果应该是这样的

L8_ = [[scene 1_B1, scene 1_B2, ...], [scene 2_B1, scene 2_B2, ...]]

即,L8_包含 2 个列表,每个列表有 8 个字符串,因为我有 2 个场景,每个场景有 8 个乐队。

我还尝试摆弄第三个变量 <x>,这样我就可以用它来将L8_sub附加到 L8 中的特定列表索引,但我不断收到“超出范围索引”错误。

感谢您提供的任何反馈!

如果问题很长,我深表歉意,但我在这个网站上已经有一段时间了,我知道在没有任何上下文或示例代码的情况下理解问题是多么困难。

python for-loop 嵌套列表 python-re

评论

0赞 njzk2 11/2/2022
乍一看,一个问题是您在不创建新列表的情况下多次附加到列表中。L8_subL8_
0赞 Marcelo Silva 11/2/2022
@njzk2 “不创建新的”是什么意思?你认为我的 for 循环运行 z 16 次,附加到 L8_sub 16 次,附加到 L8_ 16 次吗?它运行得相当快,所以我还没有考虑过这种可能性......

答: 暂无答案