如何修复Python列表中forloop中丢失的值?

2024-03-29 10:03:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对Python列表的值进行编码以优化它,但是函数的中间缺少该值。在

我的环境如下。在

PC 1-不带GPU的Windows 10(64位)、Python 3.6.8(Python)、PyCharm 2018.1。在

PC 2-带GPU的Windows 10(64位)、Python 3.6.8(Python)、PyCharm 2019.1。在

我想从酶.txt'文件并将字符串数据转换为整数类型。但是,由于序列是一个字符串,所以我创建了一个函数,在转换为整数时创建并转换类似字典表的代码。但是,我不知道原因是什么,但是在x[I][j]中I=860,j=106时没有值,所以for循环停止,错误如下。在

import numpy as np
from keras.utils import np_utils


file = 'enzyme.txt'


def data(file):
    f = open(file, 'r')
    lines = f.readlines()
    seq = []
    ec = []
    for i in range(0, len(lines)):
        lines[i] = lines[i].strip('\n')
        seq.append(lines[i][:-2])
        ec.append(lines[i][-1])
    f.close()
    return seq, ec

x, y = data(file)

Amino_Acid_Scalar = {
    'X': 0,
    'A': 1,
    'C': 2,
    'D': 3,
    'E': 4,
    'F': 5,
    'G': 6,
    'H': 7,
    'I': 8,
    'K': 9,
    'L': 10,
    'M': 11,
    'N': 12,
    'P': 13,
    'Q': 14,
    'R': 15,
    'S': 16,
    'T': 17,
    'V': 18,
    'W': 19,
    'Y': 20
}


def amino_acid_to_scalar(amino_acid):
    if not amino_acid in Amino_Acid_Scalar:
        return None
    return Amino_Acid_Scalar[amino_acid]


def sequence_to_scalar(sequence):
    scalar = [amino_acid_to_scalar(amino_acid) for amino_acid in sequence]
    if None in scalar:
        return None
    return scalar


def sequences_to_scalar(sequences):
    scalars = [sequence_to_scalar(sequence) for sequence in sequences]
    return scalars


x = sequences_to_scalar(x)

for i in range(0, len(x)):
    for j in range(0, len(x[i])):
        #print(x[i][j], i, j)
        #tmp = x[i][j]
        #print(tmp)
        #arr[i][j] = tmp
        pass

y = np_utils.to_categorical(y, 7)
x = np.array(x)
y = np.array(y, dtype='int64')

在'酶.txt'文件,858到862列如下。在

^{pr2}$

显示以下错误。在

Using TensorFlow backend.
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm 2018.1\helpers\pydev\pydev_run_in_console.py", line 53, in run_file
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm 2018.1\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/Inyong/Documents/PycharmProjects/Test/Test_4_TXT.py", line 81, in <module>
    for j in range(0, len(x[i])):
TypeError: object of type 'NoneType' has no len()

所以当我想知道它停在哪里的价值时

> x[860][106]

我得到以下错误。在

Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable

我真的很感谢你的帮助。在


Tags: toinforlenreturndefnppycharm
1条回答
网友
1楼 · 发布于 2024-03-29 10:03:19

你很好地解决了这个问题。你看到的是x = None 或者x[860]=None,因为你不能有{}。在

我对整个代码的建议:

  • 首先要改掉重复len(thing)或{}的习惯。因为错误很难追踪,不是吗:)。看这个话题的精彩演讲https://www.youtube.com/watch?v=EnSu9hHGq5o
  • 使用关键字“with”更容易打开文件,您将在文档中看到它作为上下文管理器(有关如何使用它的示例,请参见下文)
  • 下面是纽比密码。我觉得你考虑速度很好。我会避免做裸体或熊猫。astype('category') 或者类似的情况,因为一个序列可能是所有的“L”,在这个点上它们都会映射到0,而不是像氨基酸标量字典中那样的10个。在
  • 我不知道氨基酸标量值是你选择的还是给你的,但我建议使用更简单的方法,比如ord(base)-65,那么你的映射就会更容易,而且
  • 您的基将很好地放入一个以int8作为数据类型的Numpy数组中。在

这个代码可以缩短。在

def amino_acid_to_scalar(amino_acid):
    if not amino_acid in Amino_Acid_Scalar:
        return None
    return Amino_Acid_Scalar[amino_acid]

可以用字典“get”方法替换此函数:

^{pr2}$

其中“None”是您希望在没有键的情况下发回的默认值。(或者可以使用shortend版本Amino_Acid_scalar.get(amino_acid),因为None是默认返回值)

import numpy as np
from keras.utils import np_utils


Amino_Acid_Scalar = {
    'X': 0,
    'A': 1,
    'C': 2,
    'D': 3,
    'E': 4,
    'F': 5,
    'G': 6,
    'H': 7,
    'I': 8,
    'K': 9,
    'L': 10,
    'M': 11,
    'N': 12,
    'P': 13,
    'Q': 14,
    'R': 15,
    'S': 16,
    'T': 17,
    'V': 18,
    'W': 19,
    'Y': 20
}

file = 'enzyme.txt'

seqs = []
ecs = []


with open(file, 'r') as f:
    for line in f:
        try:
            seq, ec=line.strip().partition(',')[0:3:2]
            seqs.append(seq)
            ecs.append(ec)
        except (ValueError, IndexError) as e:
            print(f'problem was at line {line} with error: {e}')


def sequence_to_scalar(sequence):
    for amino_acid in sequence:
        value = Amino_Acid_Scalar.get(amino_acid, None)
        if value:
            yield value


def sequences_to_scalar(sequences):
    scalars = [sequence_to_scalar(sequence) for sequence in sequences]
    return scalars


scalar_seqs = sequences_to_scalar(seqs)

for count, seq in enumerate(scalar_seqs):
    for count_inner, base in enumerate(seq):
        print(f'{count}, {count_inner}, {base}')

相关问题 更多 >