如何修复 Python 列表中 for 循环中的缺失值?
How do I fix missing values in a for-loop in a Python list?
我想对 Python 列表的值进行编码以对其进行优化,但该值在我的函数中间丢失了。
我的环境如下
PC 1 - Windows10(64 位)无 GPU,Python3.6.8(Anaconda),PyCharm2018.1.
PC 2 - Windows10(64 位)带 GPU,Python3.6.8(Anaconda),PyCharm2019.1.
我想从'enzyme.txt'文件中获取蛋白质序列信息,并将字符串数据转换为整数类型。但是,由于序列是一个字符串,所以我创建了一个函数来创建和转换一个字典 table ,就像在更改为整数时的代码一样。但是,我不知道是什么原因,但是在 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')
在 'enzyme.txt' 文件中,第 858 列到第 862 列如下。
ATKAVCVLKGDGPVQGIINFEQKESNGPVKVWGSIKGLTEGLHGFHVHEFGDNTAGCTSAGPHFNPLSRKHGGPKDEERHVGDLRNVTADKDGVADVSIEDSVISLSGDHCIIGRTLVVHEKADDLGKGGNEESTKTGNAGSRLACGVIGIAQ,1
ATKAVCVLKGDGPVQGIINFEQKESNGPVKVWGSIKGLTEGLHGFHVHEFGDNTAGCTSAGPHFNPLSRKHGGPKDEERHVGDLRNVTADKDGVADVSIEDSVISLSGDHCIIGRTLVVHEKADDLGKGGNEESTKTGNAGSRLACGVIGIAQ,1
MRVVVIGAGVIGLSTALCIHERYHSVLQPLDIKVYADRFTPLTTTDVAAGLWQPYLSDPNNPQEADWSQQTFDYLLSHVHGCALEAAKLFGRILEEKKLSRMPPSHL,1
MPKFYCDYCDTYLTHDSPSVRKTHCSGRKHKENVKDYYCKWMEEQAQSLIDKTTAAFQQGKIPPTPFSAPPPAGAMIUGGGAAACUCGACUGCAUAAUUUGUGGUAGUGGGGGACUGCGUUCGCGCUUUCCCCUG,1
GPHMSIHSGRIAAVHNVPLSVLIRPLPSVLDPAKVQSLVDTIREDPDSVPPIDVLWIKGAQGGDYFYSFGGSHRYAAYQQLQRETIPAKLVQSTLSDLRVYLGASTPDLQ,1
显示如下错误。
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
非常感谢您的帮助。
你很好地找到了问题所在。你看到的是 x = None
或 x[860]=None
因为你不能 None[186]
.
我对整个代码的建议:
- 首先改掉在
len(thing)
或range(len(thing))
上迭代的习惯。因为错误很难追踪,不是吗 :)。看精彩演讲https://www.youtube.com/watch?v=EnSu9hHGq5o
- 使用关键字 "with" 打开文件更容易,您将在文档中看到它作为上下文管理器(有关如何使用它的示例,请参见下文)
- 在底部你有 numpy 代码。虽然我认为这很棒,但您正在考虑速度。我会避免做 Numpy 或 Pandas .astype('category')
或类似的东西,因为一个序列可能全部是 "L",此时它们将全部映射到零,而不是像 Amino_Acid_Scalar 字典中那样映射到十。
- 我不知道 Amino_Acid_Scalar 值是你选择的还是给你的,但我建议使用更简单的东西,比如
ord(base)-65
那么你的映射会更容易
- 你的基础将很好地适应一个以 int8 作为 dtype 的 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"方法替换这个函数:
Amino_Acid_Scalar.get(amino_acid, None)
其中 "None" 是您希望在没有密钥的情况下发回的默认值。 (或者您可以使用缩写版本 Amino_Acid_scalar.get(amino_acid)
,因为 None 是默认的 return 值)
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}')
我想对 Python 列表的值进行编码以对其进行优化,但该值在我的函数中间丢失了。
我的环境如下
PC 1 - Windows10(64 位)无 GPU,Python3.6.8(Anaconda),PyCharm2018.1.
PC 2 - Windows10(64 位)带 GPU,Python3.6.8(Anaconda),PyCharm2019.1.
我想从'enzyme.txt'文件中获取蛋白质序列信息,并将字符串数据转换为整数类型。但是,由于序列是一个字符串,所以我创建了一个函数来创建和转换一个字典 table ,就像在更改为整数时的代码一样。但是,我不知道是什么原因,但是在 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')
在 'enzyme.txt' 文件中,第 858 列到第 862 列如下。
ATKAVCVLKGDGPVQGIINFEQKESNGPVKVWGSIKGLTEGLHGFHVHEFGDNTAGCTSAGPHFNPLSRKHGGPKDEERHVGDLRNVTADKDGVADVSIEDSVISLSGDHCIIGRTLVVHEKADDLGKGGNEESTKTGNAGSRLACGVIGIAQ,1
ATKAVCVLKGDGPVQGIINFEQKESNGPVKVWGSIKGLTEGLHGFHVHEFGDNTAGCTSAGPHFNPLSRKHGGPKDEERHVGDLRNVTADKDGVADVSIEDSVISLSGDHCIIGRTLVVHEKADDLGKGGNEESTKTGNAGSRLACGVIGIAQ,1
MRVVVIGAGVIGLSTALCIHERYHSVLQPLDIKVYADRFTPLTTTDVAAGLWQPYLSDPNNPQEADWSQQTFDYLLSHVHGCALEAAKLFGRILEEKKLSRMPPSHL,1
MPKFYCDYCDTYLTHDSPSVRKTHCSGRKHKENVKDYYCKWMEEQAQSLIDKTTAAFQQGKIPPTPFSAPPPAGAMIUGGGAAACUCGACUGCAUAAUUUGUGGUAGUGGGGGACUGCGUUCGCGCUUUCCCCUG,1
GPHMSIHSGRIAAVHNVPLSVLIRPLPSVLDPAKVQSLVDTIREDPDSVPPIDVLWIKGAQGGDYFYSFGGSHRYAAYQQLQRETIPAKLVQSTLSDLRVYLGASTPDLQ,1
显示如下错误。
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
非常感谢您的帮助。
你很好地找到了问题所在。你看到的是 x = None
或 x[860]=None
因为你不能 None[186]
.
我对整个代码的建议:
- 首先改掉在
len(thing)
或range(len(thing))
上迭代的习惯。因为错误很难追踪,不是吗 :)。看精彩演讲https://www.youtube.com/watch?v=EnSu9hHGq5o - 使用关键字 "with" 打开文件更容易,您将在文档中看到它作为上下文管理器(有关如何使用它的示例,请参见下文)
- 在底部你有 numpy 代码。虽然我认为这很棒,但您正在考虑速度。我会避免做 Numpy 或 Pandas .astype('category') 或类似的东西,因为一个序列可能全部是 "L",此时它们将全部映射到零,而不是像 Amino_Acid_Scalar 字典中那样映射到十。
- 我不知道 Amino_Acid_Scalar 值是你选择的还是给你的,但我建议使用更简单的东西,比如
ord(base)-65
那么你的映射会更容易 - 你的基础将很好地适应一个以 int8 作为 dtype 的 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"方法替换这个函数:
Amino_Acid_Scalar.get(amino_acid, None)
其中 "None" 是您希望在没有密钥的情况下发回的默认值。 (或者您可以使用缩写版本 Amino_Acid_scalar.get(amino_acid)
,因为 None 是默认的 return 值)
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}')