想象一下文本文件中的网格如下:
A B C
A 0 1 2
B 3 0 5
C 6 7 0
在python中将其转换为字典的最佳方法是什么,如下所示:
^{pr2}$所以我可以通过以下方式访问单元格:
matrix['A']['B'] # 3
我目前确实有一些非常粗糙的代码(请不要对我太苛刻):
matrix = {}
f = open(filepath, 'r')
lines = f.readlines()
keys = lines[0].split()
for key in keys:
matrix[key] = {}
for line in lines[1:]:
chars = line.split()
key_a = chars[0]
for i, c in enumerate(chars[1:]):
key_b = keys[i-1]
matrix[key_a][key_b] = int(c)
print matrix
# Outputs {'A': {'A': 1, 'C': 0, 'B': 2}, 'C': {'A': 7, 'C': 6, 'B': 0}, 'B': {'A': 0, 'C': 3, 'B': 5}}
虽然这没有错,但我已经离开python很久了,有没有更好的方法呢?也许嵌套字典实际上不是最好的方法?在
更新:
您的代码是合理的,但这里有一个替代方案:
它产生了
^{pr2}$一些提示:
使用
而不是
因为当Python离开时file handle is closed for you
with-block
。通过使用with
,您将永远不会忘记关闭一个filehandle,即使发生异常,在离开with-block
时,filehandle仍将被关闭。一般来说,最好尽量避免{}。这个
将整个文件拖进一个列表中。这可能会让你的记忆变得沉重,
尤其是如果文件很大的话。通常
可以代替使用。
如果你使
matrix
acollections.default(dict),那么matrix[field]
默认为dict
。所以你可以跳过 初始化:defaultdict
是dict
的一个子类,因此您可以非常频繁地使用它 就像你一样。如果你不喜欢它的印刷方式 想停止matrix
自动将空dict分配给matrix[key]
对于任何key
,可以将defaultdict转换回 一个正则的dict
,具有:如果可以,请避免在
for-loops
中使用数字索引。在尽管对于大多数类似C的语言来说这是一个derigueur,但是Python有一个 更好的方法:循环项目本身:
这使得代码更具可读性,因为它指定了一个变量名 你真正感兴趣的对象,而不仅仅是一个 然后你必须把它们组合成
keys[i-1]
。这也有帮助 您可以避免“关闭一个”错误,这可能发生在您必须调整 按一索引,如keys[i-1]
中所做的那样。另一种可能是不使用嵌套dict,而是使用2元组(列、行)作为键:
收益率
然后您可以访问矩阵中的(列,行),如下所示:
顺便说一下,如果您安装pandas:
收益率
相关问题 更多 >
编程相关推荐