Python 3.6中的DNA转录代码失败' ACGTXXXCTTAA'测试

时间:2018-04-25 20:53:01

标签: python

我正在尝试解决DNA到RNA转录问题,但我的代码无法通过此测试用例:ACGTXXXCTTAA

转录应如下:

G --> C

C --> G

T --> A

A --> U

这是我的代码:

dna = input()
new = ""

for i in dna:
    if i not in 'ATGC':
        print("Invalid Input")
        break
    if i == 'A':
        new += 'U'
    elif i == 'C':
        new += 'G'
    elif i == 'T':
        new += 'A'
    else:
        new += 'C'

print(new)

此代码通过除上述测试之外的所有测试。正确的输出应该是:

Invalid Input

我的代码输出:

Invalid Input
UGCA

我尝试了很多迭代,但我无法摆脱UGCA。即使我使用break在任何Invalid Input的情况下离开循环,代码也能够在ACGT之前转录XXX并在应该输出时打印结果Invalid Input

有人能看到我错过的东西吗?

5 个答案:

答案 0 :(得分:5)

您始终使用print("Invalid Input")打印新内容,只需将新值更改为“无效输入”即可。并打印。这应该可以解决你的问题!

dna = input()
new = ""

for i in dna:
    if i not in 'ATGC':
        new = "Invalid Input"
        break
    if i == 'A':
        new += 'U'
    elif i == 'C':
        new += 'G'
    elif i == 'T':
        new += 'A'
    else:
        new += 'C'

print(new)

答案 1 :(得分:4)

这是一个很好的问题,因为它一次引入了很多概念!直接问题是,即使您抛出Invalid Input错误,仍然会打印new这是部分转录的序列。要解决这个问题,您可以让错误处理代码抛出异常,或者只是将结果空白。我可能会把它变成一个函数并抛出异常。

def dna_to_rna(dna):
    acc = []
    for ch in dna:
        if ch not in 'ATGC':
            raise ValueError("Invalid Input")
        if ch == 'A':
            acc.append('U')
        # ... and etc for each alternation
    return ''.join(acc)  # return the correct complete sequence
                         # only after all characters are processed

try:
    result = dna_to_rna(whatever_sequence)
except ValueError as e:
    print(e)

然而,这也是使用字典进行查找的一个很好的例子,而不是一个很长的if/elif/else

mapping = {'A': 'U',
           'C': 'G',
           'T', 'A',
           'G', 'C'}
try:
    result = ''.join([mapping.get(ch) for ch in dna])
except TypeError:
    # if any member of `dna` is not ATCG, it will try to `''.join` over
    # a None value, which throws a TypeError
    print("Invalid Input")
else:
    print(result)

答案 2 :(得分:2)

为了简洁和清晰,您可以尝试这样的事情

DNA_TO_RNA_MAP = {'G': 'C', 'C': 'G', 'T': 'A', 'A': 'U'}

dna = input()

if any(base not in DNA_TO_RNA_MAP.keys() for base in dna):
    print('Invalid Input')
else: 
    print(''.join(DNA_TO_RNA_MAP[base] for base in dna))

答案 3 :(得分:1)

new = ''
dna = input()

for i in dna:
    if i not in "GCTA":
        print('Invalid Input')
        break
else:
    for j in dna:
        if j == 'G':
            new += 'C'
        elif j == 'C':
            new +='G'
        elif j == 'T':
            new +='A'
        elif j == 'A':
            new +='U'
        else:
            print("Invalid Input")
print(new)

答案 4 :(得分:0)

b=input()
a="GCTA"
c="CGAU"
try:print(''.join([c[a.index(i)]for i in b]))
except:print("Invalid Input")