[英]Is there a better way to write this snippet in python?
我有一个 numpy 字母向量和一个像这样的值矩阵:
vec = array(["A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F", "P", "S", "T", "W", "Y", "V"], dtype="<U1")
matrix = array(
[
[5.0, -2.0, -1.0, -2.0, -1.0, -1.0, -1.0, 0.0, -2.0, -1.0, -2.0, -1.0, -1.0, -3.0, -1.0, 1.0, 0.0, -3.0, -2.0, 0.0],
[-2.0, 7.0, -1.0, -2.0, -4.0, 1.0, 0.0, -3.0, 0.0, -4.0, -3.0, 3.0, -2.0, -3.0, -3.0, -1.0, -1.0, -3.0, -1.0, -3.0],
[-1.0, -1.0, 7.0, 2.0, -2.0, 0.0, 0.0, 0.0, 1.0, -3.0, -4.0, 0.0, -2.0, -4.0, -2.0, 1.0, 0.0, -4.0, -2.0, -3.0],
[-2.0, -2.0, 2.0, 8.0, -4.0, 0.0, 2.0, -1.0, -1.0, -4.0, -4.0, -1.0, -4.0, -5.0, -1.0, 0.0, -1.0, -5.0, -3.0, -4.0],
[-1.0, -4.0, -2.0, -4.0, 13.0, -3.0, -3.0, -3.0, -3.0, -2.0, -2.0, -3.0, -2.0, -2.0, -4.0, -1.0, -1.0, -5.0, -3.0, -1.0],
]
)
我得到了这种方式来使用它们来做这样的 dict :
struct = {}
for i, char in enumerate(vec):
struct[char] = {}
for j, char2 in enumerate(vec):
struct[char][char2] = matrix[i, j]
struct = {
"A": {"A": 5.0, "R": -2.0, "N": -1.0, "D": -2.0, "C": -1.0, "Q": -1.0, "E": -1.0, "G": 0.0, "H": -2.0, "I": -1.0, "L": -2.0, "K": -1.0, "M": -1.0, "F": -3.0, "P": -1.0, "S": 1.0, "T": 0.0, "W": -3.0, "Y": -2.0, "V": 0.0},
"R": {"A": -2.0, "R": 7.0, "N": -1.0, "D": -2.0, "C": -4.0, "Q": 1.0, "E": 0.0, "G": -3.0, "H": 0.0, "I": -4.0, "L": -3.0, "K": 3.0, "M": -2.0, "F": -3.0, "P": -3.0, "S": -1.0, "T": -1.0, "W": -3.0, "Y": -1.0, "V": -3.0},
"N": {"A": -1.0, "R": -1.0, "N": 7.0, "D": 2.0, "C": -2.0, "Q": 0.0, "E": 0.0, "G": 0.0, "H": 1.0, "I": -3.0, "L": -4.0, "K": 0.0, "M": -2.0, "F": -4.0, "P": -2.0, "S": 1.0, "T": 0.0, "W": -4.0, "Y": -2.0, "V": -3.0},
"D": {"A": -2.0, "R": -2.0, "N": 2.0, "D": 8.0, "C": -4.0, "Q": 0.0, "E": 2.0, "G": -1.0, "H": -1.0, "I": -4.0, "L": -4.0, "K": -1.0, "M": -4.0, "F": -5.0, "P": -1.0, "S": 0.0, "T": -1.0, "W": -5.0, "Y": -3.0, "V": -4.0},
# ...
}
有没有更pythonic或更好的方法来做到这一点?
理解会更 Pythonic:
struct = {char: {char2: matrix[i, j] for j, char2 in enumerate(vec)}
for i, char in enumerate(vec)}
您应该将此发布到堆栈溢出的代码审查论坛。 但是既然你在这里,你当前的代码就很好,我只是有一些评论:
您还可以重命名变量以使其更有意义,我们已经知道矩阵和 vec 的类型,因为它们是实例化的,尝试用接近其真实含义的名称来命名它们。
您可以使用列表/字典推导,但要小心保持其可读性。
最后,如果尚未完成,您应该将代码包装在函数中:)
在好人的帮助下,我做到了:
import numpy as np
def read_matrix(filename1, filename2):
"""This function receive two files as input
filename1: file with a list symbols that represent a kind of sequence
filename2: file with integer values
It returns a dictionary of dictionary as final structure."""
alphabet = np.loadtxt(filename1, dtype=str)
blosum_matrix = np.loadtxt(filename2, dtype=float)
return {aac1: {aac2: blosum_matrix[i,j] for j, aac2 in enumerate(alphabet)}
for i, aac1 in enumerate(alphabet)}
print(read_matrix(alphabet_file, blossom_file))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.