在 Python 中嵌套 for 循环以生成 dict

时间:2021-04-12 10:22:30

标签: python json dictionary for-loop

我想遍历项目中的所有项目和带区中的所有带区(在项目对象中)。但只有外部 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 循环将被忽略。

enter image description here

更新后的结果: enter image description here

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

1 个答案:

答案 0 :(得分:0)

这是完美的工作代码:

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")))

我已经改变了(感谢评论)什么:

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