【问题标题】:How to build a 2-level dictionary? [duplicate]如何建立一个2级字典? [复制]
【发布时间】:2018-04-01 08:01:51
【问题描述】:

我正在慢慢接触 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'}
}

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

【问题讨论】:

  • 我给了你一个理论上的答案,应用了你的代码和一个建议的替代方案,它使用dicts 的list 而不是dicts 的dict 作为你的外部@ 987654327@ 正在使用增量整数。

标签: python dictionary


【解决方案1】:

您应该使用赋值运算符,而不是使用文字构造:

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 内的键值对 paris。

您的代码将是:

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) 获取现有元素的数量,然后我使用方括号根据需要输入所有信息。

重要提示

您的情况可能比这更复杂,但是拥有一个其键是自动递增整数的字典是没有意义的,这就是 lists 的用途。您的列表代码如下所示:

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() 已经在下一个位置插入了新数据。在自动递增整数作为键的情况下,lists 比 dicts 为您提供了一些优势。

输出将是:

文件 = [ {'file_name': 'test1.csv', 'file_type': 'one'}, {'file_name':'test2.csv','file_type':'两个'} ]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多