根据条件从列表中移除元素
我想从一个列表中删除一些元素,这些元素包含 'X'
或 'N'
。我需要处理一个很大的基因组。下面是一个例子:
输入:
codon=['AAT','XAC','ANT','TTA']
期望的输出:
codon=['AAT','TTA']
10 个回答
3
还有一种方法是使用过滤器来实现这个功能。
lst = filter(lambda x: 'X' not in x and 'N' not in x, list)
4
这是一种不是最快的方法,但我觉得读起来挺舒服的。
>>> [x for x in ['AAT','XAC','ANT','TTA'] if not any(y in x for y in "XN")]
['AAT', 'TTA']
>>> [x for x in ['AAT','XAC','ANT','TTA'] if not set("XN")&set(x)]
['AAT', 'TTA']
这种方法对于长的密码子会更快(假设里面有一些重复的部分)。
codon = ['AAT','XAC','ANT','TTA']
def pred(s,memo={}):
if s not in memo:
memo[s]=not any(y in s for y in "XN")
return memo[s]
print filter(pred,codon)
这是James Brooks建议的方法,你需要测试一下,看看哪种方法对你的数据更快。
codon = ['AAT','XAC','ANT','TTA']
def pred(s,memo={}):
if s not in memo:
memo[s]= not set("XN")&set(s)
return memo[s]
print filter(pred,codon)
对于这个示例密码子,使用集合的方法大约慢了10%。
7
为了基础目的
>>> [x for x in ['AAT','XAC','ANT','TTA'] if "X" not in x and "N" not in x]
['AAT', 'TTA']
但是如果你有大量数据,我建议你使用字典(dict)或集合(set)
如果你有很多其他字符,比如除了X和N之外的字符,你可以这样做
>>> [x for x in ['AAT','XAC','ANT','TTA'] if not any(ch for ch in list(x) if ch in ["X","N","Y","Z","K","J"])]
['AAT', 'TTA']
注意:list(x)
其实可以直接用x
,而["X","N","Y","Z","K","J"]
也可以简化为"XNYZKJ"
,还有gnibbler的回答,他做得最好。