如何构建一个两层的字典?

23 浏览
0 Comments

如何构建一个两层的字典?

这个问题已经在这里有了答案

如何在Python中创建嵌套字典?

我正在逐步学习Python,但似乎仍然缺少一些基础知识,特别是有关列表和字典的。

我正在构建一个导入程序,并且想要检查一个文件目录中的可导入文件。这是我试图构建的一个函数:

def check_files(directory=os.path.dirname(os.path.realpath(__file__))):
    file_number = 0
    files = {}
    for file in os.listdir(directory):
        if os.path.isfile(file):
            file_name = os.fsdecode(file)
            --> files = {file_number: {'file_name': file_name}}
            with open(file_name,'r', encoding='utf-8', errors='ignore') as f:
                line = f.readline()
                if line == firstline['one']:
                    --> files = {file_number: {'file_type': 'one'}}
                elif line == firstline['two']:
                    --> files = {file_number: {'file_type': 'two'}}
                else:
                    --> files = {file_number: {'file_type': 'unknown'}}
        file_number += 1
    return files

如您所见,我未能构建我所想要的字典来存储一些文件信息并返回它。

关于字典的结构,我想到的是这样的:

files = {
    0: {'file_name': 'test1.csv', 'file_type': 'one'},
    1: {'file_name': 'test2.csv', 'file_type': 'two'}
}

我的问题是:我该如何一步步构建字典,当我获取值并添加新的字典时?我阅读了很多针对初学者的字典解释,但它们大多不处理这种多层级情况,至少不是逐步构建。

admin 更改状态以发布 2023年5月21日
0
0 Comments

不要使用字面量构造,你应该使用赋值运算符:

base_dict = {} # same that base_dict = dict()
for i in range(10):
    base_dict[i] = {'file_name': 'test' + str(i+1) + '.csv', 'file_type': i+1}

第一行创建了一个空的 dict

循环迭代 i=0..9。然后我们使用 base_dict[i] = ...base_dict 中的元素 i 分配一个新的 dict。你可以使用方括号来访问和修改(包括创建)dict 内的键值对。

你的代码将会是:

def check_files(directory=os.path.dirname(os.path.realpath(__file__))):
    files = {}
    for file in os.listdir(directory):
        if os.path.isfile(file):
            i = len(files)
            file_name = os.fsdecode(file)
            files[i] = {'file_name': file_name}
            with open(file_name,'r', encoding='utf-8', errors='ignore') as f:
                line = f.readline()
                if line == firstline['one']:
                    files[i]['file_type'] = 'one'
                elif line == firstline['two']:
                    files[i]['file_type'] = 'one'
                else:
                    files[i]['file_type'] = 'unknown'
    return files

我删除了你使用的手动计数,使用了 i = len(files) 获取已经存在的元素数量,然后使用方括号按需输入所有信息。

重要提示

你的情况可能比这更复杂,但是有一个键是自增整数的字典毫无意义,这就是 list 存在的意义。使用列表的代码如下:

def check_files(directory=os.path.dirname(os.path.realpath(__file__))):
    files = []
    for file in os.listdir(directory):
        if os.path.isfile(file):
            file_name = os.fsdecode(file)
            files.append({'file_name': file_name})
            with open(file_name,'r', encoding='utf-8', errors='ignore') as f:
                line = f.readline()
                if line == firstline['one']:
                    files[-1]['file_type'] = 'one'
                elif line == firstline['two']:
                    files[-1]['file_type'] = 'one'
                else:
                    files[-1]['file_type'] = 'unknown'
    return files

如你所见,它与上面的代码非常相似,但是它不需要在每次迭代中计算长度,因为内置方法 list.append() 已经把新数据插入下一个位置了。对于自增整数作为键的情况,list 提供了一些优点。

输出将会是:

files = [
{'file_name': 'test1.csv', 'file_type': 'one'},
{'file_name': 'test2.csv', 'file_type': 'two'}
]

请记住,即使输出没有明确地写出数字,list 允许你以相同的方式访问数据。另外,负数也可以用于从下面访问数据,所以当我使用 files[-1]时,那意味着我们插入的最后一个元素。这就是为什么在这个例子中我不需要知道我要插入哪个元素的原因,我们只需将其附加在末尾并访问附加的最后一个值即可。

0