2017-04-17 50 views
1

在下面的列表中的数据:当列表值是字符串时如何在列表理解中使用else?

attri_values = ['gene_id "scaffold_200002.1"', 'gene_version "1"', 'transcript_id "scaffold_200002.1"', 'transcript_version "1"', 'exon_number "2"', 'gene_source "jgi"', 'gene_biotype "protein_coding"', 'transcript_source "jgi"', 'transcript_biotype "protein_coding"', 'exon_id "scaffold_200002.1.exon2"', 'exon_version "1"'] 

说我想申请一个条件表达式:

gene_id = [x for x in attri_values if 'gene_id' in x] 

# But, when there is not list values with 'gene_id' I would like to return NA (string type) but not an empty list, but I am being unsuccessful 

gene_name = [x if 'gene_name' in x else 'NA' for x in attri_values] 

print(gene_name) #gives me 
['NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA'] 

# I only want one 'NA' in string format. 

我试着写在不同的点别的条件。我也尝试了stackE的几个例子,但没有成功。

if else in a list comprehension

if/else in Python's list comprehension?

感谢,

+0

当您尝试使用'else'时会出现什么错误? –

+0

你能不能把它转换成'set'?像'gene_name = list(set([x if'gene_name'in x else'NA'for x in attri_values])' – roganjosh

+0

我没有收到我所尝试的错误,但我也没有得到确切的我想要的东西。,我也试过lambda。我可以运行for循环工作这个问题,但想学习一个非常好的和干净的方法来解决这个问题。我尝试了几个旧帖子的例子,迄今为止没有成功。 – everestial007

回答

3

你应该在你的变量赋值使用or声明。

gene_id = [x for x in attri_values if 'gene_id' in x] or ['NA'] 

这样,如果你的初始列表理解返回一个空列表,你移动到or下半年和列表['NA']赋给变量gene_id

+1

将示例切换到“gene_name”,我认为这是正确的答案。我想,“gene_name”的意思是故意得到零匹配。 – roganjosh

+1

嗯,是的,但我想OP是想得到一个gene_id的列表,如果没有任何OP然后想要返回单个元素列表。 gene_name声明只是一个人为的例子。无论如何,该方法本身是正确的,并且可以扩展到任何用例 – wpercy

+0

不够公平,其他答案被曲解。肯定比我的'set'方法更清晰:) – roganjosh

相关问题