Как вы получаете доступ к объекту словаря в списке без использования индексов? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь создать каталог папок и файлов для каждого пользователя, и я не могу получить доступ к словарю для папки в списке всех файлов пользователя , но только с использованием имени папки , не индексируя .

Я мог бы перебрать список и проверить, является ли элемент словарем с именем папки, к которому я пытаюсь получить доступ, но я чувствовал, что, возможно, был более простой способ.

userDir = {"User1": [{"folder1": [file1, file2]}, file3], "User2": []}

Как лучше всего получить доступ к словарному ключу "folder1" здесь?

for obj in userDir["User1"]: if type(obj) == dict: if "folder1" in obj.keys(): print(obj["folder1"]) # Or do something else with "folder1"

Ответы [ 2 ]

0 голосов
/ 21 января 2019

ИМХО, вам лучше не использовать список для своих папок, потому что вы все равно должны использовать индекс или итерировать элементы для поиска любого файла в вашей структуре данных.

Без типа списка ваш каталог будет выглядеть как

userDir = {
    "User1": {
        "folder1": {
            "file1": file1,
            "file2": file2
        },
        "file3": file3
    },
    "User2": {
    }
}

А если это связано с порядком файлов, у вас есть несколько вариантов.

  1. Использовать список и повторять
  2. порядок только по имени файла (папки)
  3. Устанавливать метаинформацию (включая порядок) для каждого предмета и заказывать каждый раз при получении
  4. В каждой папке есть информация о заказе

Если вы выберете вариант 2, я думаю, он наиболее прост и легок в обращении.

В противном случае:

  1. Установите метаинформацию (включая порядок) для каждого предмета и заказывайте каждый раз, когда вы получаете

(вероятно, вы должны использовать классы вместо dict)

userDir = {
    "_type": "folder",
    "User1": {
        "_type": "folder",
        "folder1": {
            "_type": "folder",
            "file1": {
                "_type": "file",
                "_content": file1,
                "_order": 1,
            },
            "file2": {
                "_type": "file",
                "_content": file2,
                "_order": 2,
            },
        },
        "file3": {
            "_type": "file",
            "_content": file3,
            "_order": 1,
        },
    },
    "User2": {
        "_type": "folder",
    }
}
  1. В каждой папке есть информация о заказе
userDir = {
    "_order": ["User1", "User2"],
    "User1": {
        "_order": ["folder1", "file3"],
        "folder1": {
            "_order": ["User1", "User2"],
            "file1": file1,
            "file2": file2
        },
        "file3": file3
    },
    "User2": {
    }
}
0 голосов
/ 21 января 2019

Как вы заметили, проблема в том, что userDir["User1"] - это список.На самом деле нет способа найти что-либо в списке, не просматривая этот список и не просматривая все (кроме использования индексов ofc).

Python предоставляет несколько хороших способов поиска по спискам, например, списки:

user1 = [x for x in userDir["User1"] if isinstance(x, dict) and "folder1" in x.keys()]

Однако реальный ответ заключается в том, что формат данных не соответствует тому, что выпытаюсь сделать.Было бы намного чище, чтобы ваш userDir выглядел более как:

userDir = {
    "User1": {
        "folder1": [file1, file2, file3]
    },
    "User2": {}
}

или что-то в этом роде.

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