【问题标题】:Nested for loop in Python to generate a dict在 Python 中嵌套 for 循环以生成字典
【发布时间】:2021-07-07 10:26:54
【问题描述】:

我想遍历项目中的所有项目和波段中的所有波段(在项目对象中)。但只有外部 for 循环有效,并且仅适用于第一项。任何想法为什么?

from satsearch import Search
from IPython.display import JSON
import json

# configuration
url = 'https://earth-search.aws.element84.com/v0' # URL to Sentinel 2 AWS catalog
collection = 'sentinel-s2-l2a-cogs'

# search parameter
startDate = '2021-01-01'
endDate = '2021-02-01'
location = [ 11.756057739257812,
          57.649809962218995,
          12.10693359375,
          57.751442372568924
       ]

bbox_search = Search(
    bbox=location, 
    datetime=startDate+"/"+endDate, 
    query={'eo:cloud_cover': {'lt': 50}},
    collections=[collection],
    url=url,
    sort={'field': 'eo:cloud_cover', 'direction': 'desc'},
    )

def get_all_files(*bands):
    bbox_search = Search(
        bbox=location, 
        datetime=startDate+"/"+endDate, 
        query={'eo:cloud_cover': {'lt': 50}},
        collections=[collection],
        url=url,
        sort={'field': 'eo:cloud_cover', 'direction': 'desc'},
    )

    items = bbox_search.items()

    downloads = {}
    data = {}
    
    for i, item in enumerate(items):
        
        data['Product ID']= item.properties["sentinel:product_id"]
        data['Preview']= item.asset("thumbnail")["href"]
        data['Date']= item.properties["datetime"]
        
        for idx, band in enumerate(bands):
            data[band] = item.asset(band)["href"]
        
        downloads[i] = data
                            
    return downloads

display(JSON(get_all_files("B01", "B02", "B03")))

结果: 结果是,只有第一个(外部)for 循环有效,并且仅适用于第一项。内部的 for 循环将被忽略。

更新后的结果:

输入数据: 这是输入数据:https://earth-search.aws.element84.com/v0/collections/sentinel-s2-l2a-cogs/items

【问题讨论】:

  • 请更新代码的缩进。 Python 对缩进非常敏感,python 程序员也是如此。
  • bands 可能是空的,你在哪里初始化呢?
  • 你能修复代码的缩进吗?此外,如果没有输入数据的示例,我们也无能为力。请添加一个最小的可重现示例。 stackoverflow.com/help/minimal-reproducible-example
  • 请显示输入示例以文本格式,格式为代码(不是屏幕截图)和准确所需的相应输出,以及在文本中,格式为代码.
  • 这是一个不同的问题。您绝对应该就该部分提出一个新问题。

标签: python json dictionary for-loop


【解决方案1】:

这是完美的工作代码:

from satsearch import Search
from IPython.display import JSON
import json

# configuration
url = 'https://earth-search.aws.element84.com/v0' # URL to Sentinel 2 AWS catalog
collection = 'sentinel-s2-l2a-cogs'

# search parameter
startDate = '2021-01-01'
endDate = '2021-02-01'
location = [ 11.756057739257812,
          57.649809962218995,
          12.10693359375,
          57.751442372568924
       ]

bbox_search = Search(
    bbox=location, 
    datetime=startDate+"/"+endDate, 
    query={'eo:cloud_cover': {'lt': 50}},
    collections=[collection],
    url=url,
    sort={'field': 'eo:cloud_cover', 'direction': 'desc'},
    )

def get_all_files(*bands):
    bbox_search = Search(
        bbox=location, 
        datetime=startDate+"/"+endDate, 
        query={'eo:cloud_cover': {'lt': 50}},
        collections=[collection],
        url=url,
        sort={'field': 'eo:cloud_cover', 'direction': 'desc'},
    )

    items = bbox_search.items()

    downloads = {}
    
    for i, item in enumerate(items):

        data = {}
        
        data['Product ID']= item.properties["sentinel:product_id"]
        data['Preview']= item.asset("thumbnail")["href"]
        data['Date']= item.properties["datetime"]
        
        for idx, band in enumerate(bands):
            data[band] = item.asset(band)["href"]
        
        downloads[i] = data
                            
    return downloads

display(JSON(get_all_files("B01", "B02", "B03")))

我改变了什么(感谢 cmets):

  • 我在两个循环中都使用了i。以这种方式更改了内部循环 for idx, band in enumerate(bands): 有帮助。
  • 也将键、值对从内部循环添加到 data dict。

【讨论】:

    猜你喜欢
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2020-06-14
    • 2021-12-03
    • 2021-04-13
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多