2017-04-17 8 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からいくつかの例を試しましたが、成功しませんでした。あなたの変数代入でor文を使用する必要があります

if else in a list comprehension

if/else in Python's list comprehension?

おかげで、

+0

「else」を試したときに、どんなエラーがありましたか? –

+0

'set'に変換できませんか? 'gene_name = list(xは 'gene_name'がxの場合は 'gene_name'、attri_valuesのxは 'NA'))' – roganjosh

+0

私が試したものでこれまでのところエラーは出ませんが、正確なものは得られません私が望むこと。ラムダも試しました。私はこの問題を解決するループを実行することができますが、この問題を解決するには非常に素晴らしく清潔な方法を学びたいと思っています。私は古い投稿からいくつかの例を試しましたが、これまでのところ成功していません。 – everestial007

答えて

3

。あなたの最初のリスト内包表記は空のリストを返す場合

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

この方法で、あなたはorの後半に移動し、変数gene_idにリスト['NA']を割り当てます。

+1

"gene_name"に例を入れてください。これは正解と思います。 "gene_name"のポイントは、ゼロマッチを得るために意図的だったと思います。 – roganjosh

+1

さて、ええ、私は、OPはgene_idのリストを取得したいと思っていましたが、OPがない場合は、OPが単一の要素リストを返そうとしていました。 gene_nameステートメントは単なる人為的な例でした。それにかかわらず、メソッド自体は正しいものであり、ユースケースにも拡張することができます。 – wpercy

+0

十分に公正で、他の答えは誤って解釈されました。コメントの私の 'set'アプローチよりもきれいです。 – roganjosh

関連する問題