创建一个包含元素的新列表

时间:2014-04-11 05:33:54

标签: python

所以我试图在我的python程序中实现的是输入任何带有与其他无关字符混合的碱基的DNA序列,并且输出只有基数的链,以大写字母表示。这是我迄今为止一直在努力的代码 - 我是python的新手,所以我不确定为什么这个程序不起作用。如果你能给我一些关于我应该在这里添加什么来使这个代码工作的指示,那就太好了。

class dnaString (str):
    def __new__(self,s):
        return str.__new__(self,s.upper())
    def bases (list):
        bases = [A,C,T,G]

    def NewStrand (self):
        NewStrand = [self]
        NewStrand = [x for x in NewStrand if x is not A]
        NewStrand = [x for x in NewStrand if x is not C]
        NewStrand = [x for x in NewStrand if x is not T]
        NewStrand = [x for x in NewStrand if x is not G]
        return (NewStrand)

    def printNewStrand (self):
        print ("New DNA strand: {0}".format(self.NewStrand()))

dna = input("Enter a dna sequence: ")
x=dnaString(dna)
x.NewStrand()

2 个答案:

答案 0 :(得分:0)

如果你只是想做你想要做的事情,那么使用类就有点过分了。

这就是你所需要的:

bases = 'ATGC'
strand = raw_input("Enter a dna sequence: ")
output = filter(lambda x: x.lower() in bases.lower(), strand)
output = output.upper()
print output

它使用python的filter函数来过滤掉不需要的字符。

  • 我们首先在bases中声明允许的字符。
  • crap可以是raw_input()函数接受的任何用户输入。
  • output调用函数filter,该函数接受一个iterable并根据作为第二个参数传递给filter()函数的函数过滤掉它的元素。 / LI>
  • lambda是python中的一个构造,允许您定义小的匿名函数。

编辑:

看起来你正在使用python 3.在python 3中没有定义raw_input,并且过滤器在python 3中返回值的方式是不同的。所以对于python 3你会这样做:

bases = 'ATGC'
strand = input("Enter a dna sequence: ")
output = list(filter(lambda x: x.lower() in bases.lower(), strand))
output = ''.join(output)
output = output.upper()
print(output)

答案 1 :(得分:0)

您只需要一个功能。这个使用生成器表达式而不是filterlambda,但结果是相同的。

>>> def strand(base="ACTG"):
...     """ Return a strand from user input """
...     s = raw_input("Enter a sequence: ")
...     return "".join(x for x in s.lower() if x in base.lower()).upper()
...

>>> strand()
Enter a sequence: asdffeeakttycasdgeadc
'AATTCAGAC'

另一个例子:

>>> strand()
Enter a sequence: asdfsdf29038520395slkdgjw3l4ktjnd,cvmbncv,bhieruoykrjghcxvb
'AGTCCGC