如何建立一个2级字典?

时间:2017-10-20 07:22:00

标签: python dictionary

我正在慢慢地用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'}
}

我的问题是:当我获取值并在其中添加新词典时,如何逐步构建词典?我通过相当多的字典解释为初学者阅读,但他们大多不处理这个多层次的情况,至少不是一步一步建立它。

1 个答案:

答案 0 :(得分:1)

不应使用文字构造,而应使用assign运算符:

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。 然后,我们使用dicti的元素base_dict分配一个新的base_dict[i] = ...。您可以使用方括号来访问和修改(包括创建)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()已经将新数据插入到下一个位置。在自动递增的整数作为键的情况下,listdict提供了一些优势。

输出结果为:

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

请记住,即使输出没有显式写入数字,list也允许您以相同的方式访问数据。此外,负整数可用于从底部访问数据,因此当我使用files[-1]时,这意味着我们插入的最后一个元素。这就是为什么我不需要知道我们在这个例子中引入了哪个元素的原因,我们只是在最后添加它并访问附加的最后一个值。