逐项搜索Python列表中的元素,并基于条件语句创建新列表

时间:2015-05-09 20:23:50

标签: python list loops for-loop

我似乎无法弄清楚迭代循环将在我的场景中做我需要的。

我有一个清单:

seqlist1 = ['C', 'G', 'T', 'G', 'T', 'A', 'G', 'A', 'C', 'G', 'T', 'A', 'A', 'A', 'C', 'A', 'T', 'T', 'T', 'A', 'C', 'C', 'T', 'G', 'T', 'T', 'G', 'A', 'T', 'C', 'T', 'G', 'A', 'G', 'T', 'G', 'C', 'T', 'C', 'G', 'G', 'G', 'A', 'A', 'A', 'T', 'T', 'C', 'C', 'T', 'C', 'A', 'G', 'T', 'G', 'A', 'T', 'G', 'C', 'C', 'T', 'T', 'A', 'A', 'C', 'G', 'C', 'T', 'T', 'C', 'C', 'C', 'A', 'T', 'G', 'C', 'C', 'C', 'A', 'G', 'G', 'C', 'A', 'C', 'G', 'A', 'G', 'T', 'A', 'C', 'T', 'C', 'G', 'T', 'T', 'C', 'A', 'C', 'C', 'G', 'T', 'T', 'T', 'T', 'C', 'T', 'C', 'G', 'A', 'C', 'G', 'T', 'A', 'G', 'A', 'A', 'T', 'A', 'A', 'C', 'G', 'C', 'T', 'A', 'C', 'T', 'T', 'C', 'G', 'C', 'A', 'T', 'T', 'G', 'C', 'A', 'G', 'A', 'G', 'T', 'G', 'G', 'C', 'G', 'G', 'A', 'C', 'C', 'C', 'T', 'A', 'A', 'C', 'G', 'G', 'C', 'A', 'G', 'T', 'T', 'C', 'T']

另一个空列表:

seqlist2 = []

我希望能够在seqlist1列表中逐项检查是否存在特定字母并且如果存在该特定字母,请在空列表中的相同索引处插入补充字母{{1 }}。

到目前为止,我已尝试过以下内容,但我知道这不对:

seqlist2

我在这里做错了什么?

7 个答案:

答案 0 :(得分:5)

您的方法是正确的,但您的语法错误。

只需迭代$scope.filter = function() { $timeout(function() { $scope.totalItems = $scope.filtered.length; }, 10); }; $scope.pageChanged = function (currentPage) { var start = (currentPage - 1) * $scope.itemsPerPage; var end = start + $scope.itemsPerPage; $scope.cats = $scope.allCats.slice(start, end); }; }); $http.get('json/cats').success(function (result) { $scope.allCats = result.nodes; $scope.filter(); }); 并使用语法检查每个项目 seqlist1。然后,使用for item in seqlist1比较item是否等于'T''A''G''C'

if item == 'A'

(我的目标不是给你花哨的单行代码,而是你可以理解的代码,因为你是初学者)

答案 1 :(得分:4)

因为我不认为有人完全解释了你的错误:

在Python中,您可以编写5 <= x <= 10,Python可以执行您认为可以执行的操作 - 告诉您x是否介于5和10之间。它与(5 <= x) and (x <= 10)基本相同。你可以阅读这种比较链here

现在你写了item in seqlist1 == 'A'。但in==是比较,您的表达实际上意味着(item in seqlist1) and (seqlist1 == 'A')。当然上半场永远是真的,下半场永远是假的。 and然后使整个事情变得虚假。

让我们确认我不会撒谎:-)。在上面的解释之后,应该清楚为什么这是真的:

>>> 'a' in 'bar' == 'bar'
True

应该清楚为什么左侧或右侧部分的括号失败:

>>> ('a' in 'bar') == 'bar'
False

>>> 'a' in ('bar' == 'bar')
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    'a' in ('bar' == 'bar')
TypeError: argument of type 'bool' is not iterable

答案 2 :(得分:3)

使用if item == 'A' ...或者更好的方法可能是使用dict将字母映射到swap:

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

seqlist1 = ['C', 'G', 'T', 'G', 'T', 'A', 'G', 'A', 'C', 'G', 'T', 'A', 'A', 'A', 'C', 'A', 'T', 'T', 'T', 'A', 'C', 'C', 'T', 'G', 'T', 'T', 'G', 'A', 'T', 'C', 'T', 'G', 'A', 'G', 'T', 'G', 'C', 'T', 'C', 'G', 'G', 'G', 'A', 'A', 'A', 'T', 'T', 'C', 'C', 'T', 'C', 'A', 'G', 'T', 'G', 'A', 'T', 'G', 'C', 'C', 'T', 'T', 'A', 'A', 'C', 'G', 'C', 'T', 'T', 'C', 'C', 'C', 'A', 'T', 'G', 'C', 'C', 'C', 'A', 'G', 'G', 'C', 'A', 'C', 'G', 'A', 'G', 'T', 'A', 'C', 'T', 'C', 'G', 'T', 'T', 'C', 'A', 'C', 'C', 'G', 'T', 'T', 'T', 'T', 'C', 'T', 'C', 'G', 'A', 'C', 'G', 'T', 'A', 'G', 'A', 'A', 'T', 'A', 'A', 'C', 'G', 'C', 'T', 'A', 'C', 'T', 'T', 'C', 'G', 'C', 'A', 'T', 'T', 'G', 'C', 'A', 'G', 'A', 'G', 'T', 'G', 'G', 'C', 'G', 'G', 'A', 'C', 'C', 'C', 'T', 'A', 'A', 'C', 'G', 'G', 'C', 'A', 'G', 'T', 'T', 'C', 'T']

# swap A -> T, T -> A ...
print([d[k] for k in seqlist1])

答案 3 :(得分:3)

from string import maketrans
tab = maketrans("ATGC","TACG")
seqlist1 = ['C', 'G', 'T', 'G', 'T', 'A', 'G', 'A', 'C', 'G', 'T', 'A', 'A', 'A', 'C', 'A', 'T', 'T', 'T', 'A', 'C', 'C', 'T', 'G', 'T', 'T', 'G', 'A', 'T', 'C', 'T', 'G', 'A', 'G', 'T', 'G', 'C', 'T', 'C', 'G', 'G', 'G', 'A', 'A', 'A', 'T', 'T', 'C', 'C', 'T', 'C', 'A', 'G', 'T', 'G', 'A', 'T', 'G', 'C', 'C', 'T', 'T', 'A', 'A', 'C', 'G', 'C', 'T', 'T', 'C', 'C', 'C', 'A', 'T', 'G', 'C', 'C', 'C', 'A', 'G', 'G', 'C', 'A', 'C', 'G', 'A', 'G', 'T', 'A', 'C', 'T', 'C', 'G', 'T', 'T', 'C', 'A', 'C', 'C', 'G', 'T', 'T', 'T', 'T', 'C', 'T', 'C', 'G', 'A', 'C', 'G', 'T', 'A', 'G', 'A', 'A', 'T', 'A', 'A', 'C', 'G', 'C', 'T', 'A', 'C', 'T', 'T', 'C', 'G', 'C', 'A', 'T', 'T', 'G', 'C', 'A', 'G', 'A', 'G', 'T', 'G', 'G', 'C', 'G', 'G', 'A', 'C', 'C', 'C', 'T', 'A', 'A', 'C', 'G', 'G', 'C', 'A', 'G', 'T', 'T', 'C', 'T']
seq_str = "".join(seqlist1)
print seq_str.translate(tab)

是一种很好的方法,特别是因为我认为列表最初是字符串形式。

我写了这个,因为它很快,它很好地利用了库内置函数。它也很可读(至少是imho)。我认为这是一个生物信息学课程,你真的只想让倒序列进行一些二次处理。 (如果这实际上是编程作业的介绍,那么你的老师可能不会喜欢这个解决方案)

如果您想拥有(orig,new)对,可以轻松地将它们拼接在一起

print zip(seq_str,seq_str.translate(tab))

答案 4 :(得分:1)

这应该足够了

seqlist1 = ....
mapping = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'}
seqlist2 = [mapping[item] for item in seqlist1]

答案 5 :(得分:1)

我会在此处采用完全不同的方法,并在致电str.translate后使用str.join

在Python 2.x中:

from string import maketrans
''.join(seqlist1).translate(maketrans('ATCG','TAGC'))

在Python 3.x中:

''.join(seqlist1).translate(str.maketrans('ATCG','TAGC'))

要将结果字符串转换回字符列表,您只需将其作为参数传递给内置列表类型。

>>> list('ATCG')
['A', 'T', 'C', 'G']

答案 6 :(得分:1)

seqlist2 = ['ATCG'['TAGC'.index(c)] for c in seqlist1]

或者:

seqlist2 = map(dict('AT TA CG GC'.split()).get, seqlist1)