如何在不使用索引的情况下访问列表中的字典对象?

时间:2019-01-21 02:19:02

标签: python arrays list dictionary nested

我正在尝试为每个用户创建文件夹和文件的目录,并且似乎无法访问所有用户文件列表中的文件夹的字典,而只能使用文件夹名称,而不是通过索引

我可以遍历列表,并检查该元素是否是我尝试访问的文件夹名称的字典,但是我觉得这可能是一种更简单的方法。

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 :(得分:2)

您已经注意到,问题是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": {}
}

或类似的内容。

答案 1 :(得分:0)

恕我直言,您最好不要在文件夹中使用列表,因为无论如何,您应该使用索引或迭代项在数据结构中查找任何文件。

没有列表类型,您的目录将是

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

如果这是因为文件顺序很重要,那么您有几种选择。

  1. 使用列表并进行迭代
  2. 仅按文件(文件夹)名称排序
  3. 为每个商品设置元信息(包括订单),并在每次获取时进行订购
  4. 每个文件夹中都有订单信息

我认为,如果您可以选择方案2,则它最简单易用。

否则:

  1. 为每个商品设置元信息(包括订单),并在每次获取时进行订购

(可能应该使用类而不是字典)

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": {
    }
}