2014-04-30 59 views
0

我有两个表,表中的一个:追加字符,列出项目,如果它在另一个列表中找到

lst = [">ctgxxxx1/n", "aatttata", ">ctgxxxx2/n", "attggag", ">ctgxxxx3/n", "ggagttata"] 

和另一形式

ATP6 = [ ">ctgxxxx1/n", ">ctgxxxx3/n"] 

对于每一个项目,在lst是也发现在ATP6我想追加“ATP6”到lst项目的末尾。在这个例子中,我想代码的输出是:

lst = [">ctgxxxx1ATP6/n", "aatttata", ">ctgxxxx2/n", "attggag", ">ctgxxxx3ATP6/n", "ggagttata"] 

目前,我有以下代码:

for x in lst: 
    if x.startswith(">"): 
     if x in ATP6: 
      x = x+"ATP6" 

然而,这心不是说完全没有任何影响。

我认为它不工作,因为我有一个嵌套的if语句,但林不知道。以及一个答案,我可以解释为什么我的代码不起作用来帮助我学习。谢谢!

+3

这已经被问了很多次,但很难找到DUP。问题是你正在改变变量'x'而不是原始列表项。迭代索引并使用其索引更改项目。如果列表包含可变对象并且您在'x'上执行了就地操作,那将会是一种不同的情况。 –

回答

0

你的问题,因为在评论中提到的,是因为你在修改元素的副本你数组,而不是原来的。 此外,还可以缩短你的代码到一个更Python列表理解像这样:

lst = [x+'ATP6' if x in ATP6 else x for x in lst] 
+0

Thankyou,有没有什么办法可以把“ATP6”放在新的符号之前(目前当我执行这个和打印文件时,我得到的是ctgxxxx换行符,然后是ATP6),或者我必须找到/ nATP6并用ATP6/N + – PaulBarr

+0

您可以使用'x [: - 1] +“ATP6”'。一般来说,我建议不要控制角色,直到你需要他们。 –

+1

如果您确定lst中的每个元素都以换行符结尾,您可以使用'x.replace('\ n','ATP6 \ n')'而不是'x +'ATP6''。 –

2

你的代码没有做你想做的事,因为你试图在你的循环中修改一个不可变类型(字符串)。这将创建一个新的对象,而不是改变原位。

我会使用列表理解:

>>> lst = [lstitem+'ATP6' if lstitem in ATP6 else lstitem for lstitem in lst] 

产量:

['>ctgxxxx1/nATP6', 
'aatttata', 
'>ctgxxxx2/n', 
'attggag', 
'>ctgxxxx3/nATP6', 
'ggagttata'] 
相关问题