如何构建一个两层的字典?
如何构建一个两层的字典?
这个问题已经在这里有了答案:
我正在逐步学习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'} }
我的问题是:我该如何一步步构建字典,当我获取值并添加新的字典时?我阅读了很多针对初学者的字典解释,但它们大多不处理这种多层级情况,至少不是逐步构建。
不要使用字面量构造,你应该使用赋值运算符:
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]
时,那意味着我们插入的最后一个元素。这就是为什么在这个例子中我不需要知道我要插入哪个元素的原因,我们只需将其附加在末尾并访问附加的最后一个值即可。