- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
seq1 ATATAT >seq2 GGGGG >seq3 TTTTT 使用 re.sub,我删除了像这样带有 ">seq"数字的行,以仅输入 -6ren">
我有一个 DNA 序列的 .txt 文件,格式如下:
>seq1
ATATAT
>seq2
GGGGG
>seq3
TTTTT
使用 re.sub,我删除了像这样带有 ">seq"数字的行,以仅输入 DNA 碱基 A、G、C 和 T 的行,然后删除“\n”如下:
ATATAT
GGGGG
TTTTT
import re
test = re.sub('\ |1|2|3|4|5|6|7|8|9|0|>|s|e|q|:', "", holder)
newone = test.rstrip("\n")
然后,我想将其用作我的一个热编码器的输入,该编码器包含在 if 语句中(有一个 if 语句用于检查 DNA 序列中是否存在任何意外的字母)。到目前为止,它看起来像这样:
for line in newone:
#if undesirable letters are present in sequence, an error message is displayed
if (bool(result)) == True:
print("The input sequence is invalid.")
#if sequence is in the correct format, proceed with one hot encoding
else:
#mapping of bases to integers as a dictionary
bases = "ATCG"
base_to_integer = dict((i, c) for c, i in enumerate(bases))
#encoding input sequence as integers
integer_encoded = [base_to_integer[y] for y in newone]
#one hot encoding
onehot_encoded = list()
for value in integer_encoded:
base = [0 for x in range(len(bases))]
base[value] = 1
onehot_encoded.extend(base)
print(onehot_encoded)
我可以在 shell 中看到这个错误,但我不确定为什么,因为我认为我已经在代码中指出“\n”需要被删除:
Traceback (most recent call last):
File "C:\Users\Agatha\Documents\testtt.py", line 38, in <module>
integer_encoded = [base_to_integer[y] for y in newone]
File "C:\Users\Agatha\Documents\testtt.py", line 38, in <listcomp>
integer_encoded = [base_to_integer[y] for y in newone]
KeyError: '\n'
我希望我的程序在输入文件的每一行上迭代代码,但我不确定如果\n 被剥离,我的 for 循环(“for line in newone”)是否会实现这一点,并且我不能弄清楚如何重新安排它以使其发挥作用。我的目标是让我的输出采用这种格式,其中每个单热编码序列都显示在单独的行上,例如:
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0
0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1]
如果您能提供有关此错误的根源以及如何修复它的建议,我将不胜感激。
最佳答案
如果我是您,我会使用 .split()
方法根据您阅读的文本创建一个列表。
test = re.sub('\ |1|2|3|4|5|6|7|8|9|0|>|s|e|q|:', "", holder)
newone = test.split("\n")
此时 newone
将类似于 ['', 'ATATAT', '', 'GGGGG', '', 'TTTTT', '']
所以去掉多余的空格:
newone = [x for x in newone if x != '']
现在您收到的错误是因为您在列表理解中(代码的第 38 行)使用的是 newone
而不是 line
。 line
的每个字母都是字典 base_to_integer
的键,但是您得到的 KeyError 是因为 \n
不是字典中的键。即使进行了我上面建议的更改后,您也会收到错误:
KeyError: 'ATATAT'
所以你应该将此行更改为:
integer_encoded = [base_to_integer[y] for y in line]
解决这个问题给了我:
[1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]
[0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]
希望这有帮助。
关于python - 为什么我的代码不迭代每一行?尽管剥离了(使用 .read() 传入的 .txt 输入),但仍存在关键错误 "\n",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57075481/
我是一名优秀的程序员,十分优秀!