gpt4 book ai didi

python - 将文本网格转换为python中的嵌套字典

转载 作者:行者123 更新时间:2023-11-28 22:56:42 25 4
gpt4 key购买 nike

想象一下这样的文本文件中的网格:

  A  B  C
A 0 1 2
B 3 0 5
C 6 7 0

将其转换为 python 中的字典的最佳方法是什么,如下所示:

{
'A': {'A': 0, 'B':3, 'C':6},
'B': {'A': 1, 'B':0, 'C':7},
'B': {'A': 2, 'B':5, 'C':0}
}

所以我可以通过以下方式访问单元格:

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 很长时间了,有没有更好的方法?也许嵌套字典实际上不是最好的方法?

更新:

  1. 不幸的是,我需要在 vanilla python 中执行此操作,因此无法使用外部库(相信我,我会喜欢)
  2. 将我的示例代码形式伪代码更新为实际代码。羞愧地低下了头。

最佳答案

你的代码是合理的,但这里有一个替代方案:

import collections
with open('grid_file.txt', 'r') as f:
columns = next(f).split()
matrix = collections.defaultdict(dict)
for line in f:
items = line.split()
row, vals = items[0], items[1:]
for col, val in zip(columns, vals):
matrix[col][row] = int(val)
print(matrix)

产生

defaultdict(<type 'dict'>, {'A': {'A': 0, 'C': 6, 'B': 3}, 'C': {'A': 2, 'C': 0, 'B': 5}, 'B': {'A': 1, 'C': 7, 'B': 0}})

一些提示:

  • 使用

    with open(...) as f
    ...

    代替

    f = open(...)
    f.close()

    因为 file handle is closed for you当 Python 离开with- block 。通过使用 with,您将永远不会忘记关闭文件句柄,即使发生异常,文件句柄仍会在离开 with-block 时关闭。

  • 一般来说,如果可以的话,最好避免使用f.readlines()。这将整个文件放入列表中。这对内存来说可能很繁重,特别是如果文件很大。通常

    with open(...) as f:
    for line in f:

    可以代替使用。

  • 如果您将矩阵设为collections.default(dict)然后matrix[field] 默认是一个 dict。所以你可以跳过初始化:

    for key in keys:
    matrix[key] = {}
  • 一个defaultdictdict的子类,所以你可以很好的使用它就像您使用 dict 一样。如果您不喜欢它的打印方式或喜欢阻止 matrix 自动分配一个空字典给matrix[key] 对于任何 key,您可以将 defaultdict 转换回一个普通的 dict 有:

    matrix = dict(matrix)
  • 如果可以,请避免在 for 循环 中使用数字索引。

    for i, c in enumerate(chars[1:]):

    虽然这对于大多数类 C 语言来说是必需的,但 Python 有一个更好的方法:遍历项目本身:

    for col, val in zip(columns, vals):

    这使代码更具可读性,因为它分配了一个变量名到你真正感兴趣的对象,而不仅仅是一个索引然后你必须组合成keys[i-1]之类的东西。它还有助于您可以避免在必须调整时可能发生的“差一个”错误索引加一,如 keys[i-1] 中所做的那样。


另一种可能性是不使用嵌套的字典,而是使用二元组(列、行)作为键:

with open('grid_file.txt', 'r') as f:
columns = next(f).split()
matrix = {}
for line in f:
items = line.split()
row, vals = items[0], items[1:]
for col, val in zip(columns, vals):
matrix[col, row] = int(val)
print(matrix)

产量

{('B', 'C'): 7, ('A', 'A'): 0, ('B', 'B'): 0, ('B', 'A'): 1, ('C', 'A'): 2, ('C', 'B'): 5, ('C', 'C'): 0, ('A', 'B'): 3, ('A', 'C'): 6}

然后你可以像这样访问矩阵中的一个(列,行):

print(matrix['A','C'])
# 6

顺便说一句,如果你安装pandas :

import pandas as pd
import io

text = '''\
A B C
A 0 1 2
B 3 0 5
C 6 7 0'''

df = pd.read_table(io.BytesIO(text), sep='\s+')
print(df.to_dict())

产量

{'A': {'A': 0, 'B': 3, 'C': 6},
'B': {'A': 1, 'B': 0, 'C': 7},
'C': {'A': 2, 'B': 5, 'C': 0}}

关于python - 将文本网格转换为python中的嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15149223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com