在我开始使用python时,尝试找出最佳编码实践。我用pandas写了一个csv到dataframe阅读器。它使用以下格式:
dataframe = read_csv(csv_input, usecols=column_names, dtype=test_dictionary)
我们正在使用字典来确定要导入的列及其关联的数据类型。例如:
test_dictionary = {'column1': int, 'column2': float, 'column3': string}
现在要分配第二个参数usecols,我们可以从字典中获取键,以便只获取列的名称(column1,column2,column3)。我使用了密钥方法:
column_names = test_dictionary.keys()
检查我的代码的人改为将其改为:
column_names = [keys for keys in test_dictionary.keys()]
有人可以向我解释为什么选择一种方法而不是另一种方法将字典中的键分配给变量?
答案 0 :(得分:4)
在Python 3中,keys()
不返回列表,而是返回a "view" of the keys in the dictionary。
>>> d = {'x': 1, 'y': 2, 'z': 3}
>>> keys = d.keys()
>>> keys
dict_keys(['x', 'y', 'z'])
此视图与列表的不同之处主要有两种:
您无法修改它:
>>> keys.append('k')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict_keys' object has no attribute 'append'
如果字典发生变化,视图会反映这些变化:
>>> del d['z']
>>> keys
dict_keys(['x', 'y'])
如果您需要修改此视图或希望它独立于原始字典,您可能希望将此视图转换为列表。
除了列表之外,适用于这些目的的其他标准容器是set(读写)和tuple或frozensets(只读)。
值得一提的是这段代码:
column_names = [keys for keys in test_dictionary.keys()]
可以像这样更紧凑,更快速地重写(感谢Cleb指出来!):
column_names = list(test_dictionary)
需要注意的另一件事是迭代列表可能比迭代视图稍微快一些。这是因为列表具有更好的内存表示。 (但是,这是一个非常通用的陈述:诸如字典中的项目数,创建列表所需的时间以及Python版本等因素会对整体性能产生很大影响。)