Понимание этого варианта использования для словаря - PullRequest
0 голосов
/ 27 октября 2018

Я работаю над учебником по Python и натолкнулся на это использование словаря К сожалению, было НУЛЬНОЕ объяснение того, что именно происходит, и мне трудно понять, что именно происходит.

Для анализа данных ниже:

[TERRA]
dir  = /data/geospatial_19/ucfajlg/fire/Angola/MOD09
name = MODIS TERRA data
year = 2004
doy_start = 214
doy_end = 245
file_list = files/data/modis_files2a.txt

[AQUA]
dir  = /data/geospatial_19/ucfajlg/fire/Angola/MYD09
name = MODIS AQUA data
year = 2004
doy_start = 214
doy_end = 245
file_list = files/data/modis_files2b.txt

мы используем этот код:

fp = open(r'c:\files_folder\modis.txt', 'r')

modis = {}
this_section = modis

for line in fp.readlines():
    line = line.strip()

    if len(line) and line[0] == '[' and line [-1] == ']':
        section = line[1:-1]
        modis[section] = this_section = {}

    elif len(line) and line.find("=") != -1:
        key,value = line.split("=")
        this_section[key.strip()] = value.strip()   

print modis

Ниже приводится вложенный словарь, но я не понимаю, как.

{'AQUA': {'doy_end': '245', 'doy_start': '214', 'name': 'MODIS AQUA data', 'year': '2004', 'file_list': 'files/data/modis_files2b.txt', 'dir': '/data/geospatial_19/ucfajlg/fire/Angola/MYD09'}, 'TERRA': {'doy_end': '245', 'doy_start': '214', 'name': 'MODIS TERRA data', 'year': '2004', 'file_list': 'files/data/modis_files2a.txt', 'dir': '/data/geospatial_19/ucfajlg/fire/Angola/MOD09'}}

Что здесь происходит: modis[section] = this_section = {}?

У этого маневра есть имя?

1 Ответ

0 голосов
/ 27 октября 2018

Как отмечается в комментарии, строка modis[section] = this_section = {} - это короткий способ сказать эквивалентные две строки:

this_section = {}
modis[section] = this_section

Но это может использовать больше распаковки.

Предыдущая строкаравно

section = line[1:-1]

, которое достигается, когда переменная line является строкой, которая начинается и заканчивается квадратными скобками.Другими словами, line содержит название раздела в вашем файле данных.Затем section = line[1:-1] копирует все, кроме окружающих скобок, поэтому переменная section теперь содержит название раздела.(Первый раз, когда он выполняется, получается значение 'TERRA ', например.) Эта переменная имеет неправильное имя - она ​​должна называться section_name, так как на самом деле это не раздел, но я буду продолжать использоватьимя.

Затем this_section = {} создает новый пустой раздел в виде пустого словаря.Сразу после этого modis[section] = this_section помещает этот новый пустой словарь в больший modis словарь и связывает раздел с именем раздела.Вот как 'TERRA': {...} попадает в словарь результатов.

Следующие несколько строк, начинающиеся с elif len(line) and line.find("=") != -1:, затем заполняют внутренний словарь, все еще называемый this_section.Каждая из строк в разделе в файле помещается в этот внутренний словарь по одной строке после анализа имени ключа и значения ключа из строки файла.

Так что это общий потокпрограмма.Файл данных открывается, и словарь результатов modis создается как пустой словарь.Имя первого раздела в файле данных найдено, поэтому создается внутренний пустой словарь с правильным именем раздела.Каждая строка в этом разделе файла данных затем помещается во внутренний словарь в нужном формате.Когда новое имя раздела найдено, новый внутренний пустой словарь создается для этого нового раздела.И так далее.

Это ясно?


Ваш последний комментарий спрашивает о двух строках сразу после строки fp = open(.Утверждение modis = {} ясно: оно создает полный словарь, который будет пустым и будет заполнен позже.

Следующая строка this_section = modis неуловима.По сути, он предназначен для проверки ошибок.Основной поток программы предполагает, что файл данных представляет собой последовательность разделов, причем каждый раздел начинается с имени раздела в квадратных скобках.Но что если первый раздел не имеет названия раздела?Программа устанавливает первый внутренний словарь в словарь external , поэтому любые строки элементов будут помещены непосредственно во внешний словарь.Таким образом, элементам строки нужно куда-то идти, хотя для них не существует внутреннего словаря.Если первый раздел имеет имя раздела, то эта начальная строка ничего не делает, поскольку переменная this_section немедленно станет новым пустым внутренним словарем.Не существует ситуации, когда словарь modis будет вставлен в саму себя.

Другой способ справиться с этим - создать начальный внутренний словарь с пустым именем, таким как пустая строка, илиNone значение, чтобы держать любой мошеннический безымянный начальный раздел.Затем в конце программа может проверить, использовался ли этот раздел, а если нет, то просто удалить его.Но это потребовало бы больше строк кода и выглядело бы более сложным - используемое решение добавляет только одну строку кода и является простым на вид, даже если оно не простое по смыслу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...