繁体   English   中英

有没有更好的方法在 python 中编写此代码段?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM