【问题标题】:How to create a function that looks at individual letters in a string?如何创建一个查看字符串中单个字母的函数?
【发布时间】:2017-08-01 13:53:29
【问题描述】:

我正在尝试创建一个函数,该函数将接收 DNA 字符串,然后对其进行补充(即,如果 A,则给出 T,如果 G,则给出 C [反之亦然])。

到目前为止,我有这个代码:

def Complement(DNA):
    DNA = input("Enter your DNA string:")
    if DNA == 'A':
        result = 'T'
    elif DNA == 'T':
        result = 'A'
    elif DNA == 'G':
        result = 'C'
    else:
        result = 'G'
    return (result)

但是,python 将 4 'digit' 字符串作为 'else' 并导致 G 作为输出。如何更改此代码,以便任何人都可以输入随机字母/大小的 DNA 字符串,并且该函数将补充每个字母? 如果您的 DNA 字符串中只有一个没有真正帮助的字母,则此代码有效:/

谢谢

【问题讨论】:

  • 您查看的是第一个字母还是 DNA 变量是否包含该字母。您的代码会将存储在 DNA 中的值与“A”或“T”等进行比较。如果 DNA 是 ABC,则不等于“A”,但如果 DNA 只是“A”,则两个字符串相等。这就是如果您有任何超过一个字母的字符串,那么这些字符串将等于任何字符并且结果将设置为 G
  • 代码对我有用,请提供您输入的版本。此外,出于安全原因,请使用 raw_input 而不是 input。最后,要么从参数列表中删除DNA,要么删除input 语句,因为你不需要它们两个:)
  • @Yan 我认为她(或他)是说她(或他)希望他们的解决方案能够处理超过 1 个字符的输入。
  • @Ambitions 仅供参考,raw_input 在 Python 3 中已重命名为 input。(当然,不确定这里使用的是哪种语言。)
  • python 3^ raw_input 对字符串长度问题没有帮助

标签: python string function


【解决方案1】:

使用字典是一种简单的方法

另外,这是不区分大小写,因为我在循环之前调用了 .upper() 字符串函数。

di = {
    "A":"T",
    "T":"A",
    "G":"C",
    "C":"G"
}

def Complement(DNA):
    result = ""
    for char in DNA.upper():
        result += di[char]
    return (result)

print(Complement("ATGC"))
print(Complement(input("Enter your DNA string: ")))

【讨论】:

  • 有趣的是你应该提到这一点。我们实际上在 SO 这里有一个“官方”术语,称为 FGITW(Fastest Gun In The West)
  • 是的,当我详细介绍时,这让我很困惑。这是一个更肤浅的问题,所以我真的不需要。
【解决方案2】:

您需要遍历字符串 DNA 以比较其每个字符。在您的情况下,您将整个字符串 DNA 与单个字符进行比较。

DNA = input("Enter your DNA string:")
for i in DNA:
    if i == 'A':
        result = 'T'
    elif i == 'T':
        result = 'A'
    elif i == 'G':
        result = 'C'
    else:
        result = 'G'

您可能希望将结果存储在某处,因此您可以将其附加到结果中,而不是覆盖结果的值

def Complement(DNA):
    result = ""
    for i in DNA:
        if i == 'A':
            result = result + 'T'
        elif i == 'T':
            result =result +  'A'
        elif i == 'G':
            result = result + 'C'
        else:
            result = result + 'G'
    return (result)

【讨论】:

  • 好的,一个问题,为什么结果必须放在for循环之前?结果不能只是:result = 'T' 还是行不通?另外,感谢循环建议,我什至没有想到...
  • 因为如果你把它放在for循环里面,它会在每次迭代后重新初始化为空字符串("")。
  • 如果你使用 result = 'T' 那么在每次迭代之后你会用新的值覆盖 result 的值。 result = result + 'T' 创建一个新字符串,它是 result 和 'T' 的串联。这样你的最终结果就是每次迭代的组合结果。
  • 啊,我明白了,谢谢你的帮助!考虑到我在 python 中的新手级别,您的代码是最容易理解的。谢谢
【解决方案3】:

试试这个:

def complement():
    # read the DNA sequence from stdin
    dna = input("Enter your DNA string:")

    # start with an empty result
    result = ""

    # iterate over each character of the sequence, and
    # add the corresponding character to the result
    for character in dna:
        if character == "A":
            result += "T"
        elif character == "T":
            result += "A"
        elif character == "G":
            result += "C"
        elif character == "C":
            result += "G"

    return result

【讨论】:

    【解决方案4】:

    这样的东西可以让你选择任意长度的字符串:

    def Complement():
        print("Enter your DNA string: ")
        DNA = str(input())
        result = ''
        for i in DNA:
            if i == 'A':
                result = result + 'T'
            elif i == 'T':
                result = result + 'A'
            elif i == 'G':
                result = result + 'C'
            else:
                result = result + 'G'
       return result
    

    【讨论】:

    • 谢谢!非常有帮助!特别是因为字符串可以是无限的。
    【解决方案5】:

    Python 的string translate method 正是针对此类问题而设计的:

    >>> import string
    >>> xlat = string.maketrans('atgcATGC', 'tacgTACG')
    >>> 'gattaca'.translate(xlat)
    'ctaatgt'
    

    xlat 变量是一个转换表。 str.translate() 方法接受一个字符串并应用翻译表。

    【讨论】:

    • Python 从字面上看对所有事物都有一个功能。这个真的很酷。更令人惊奇的是,您甚至可以记住这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多