【问题标题】:How to use else with list comprehension when list values are string?当列表值为字符串时,如何将 else 与列表理解一起使用?
【发布时间】:2017-09-13 11:58:41
【问题描述】:

在以下列表数据中:

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.

我尝试在不同的点写 else 条件。我还尝试了 stackE 中的几个示例,但没有成功。

if else in a list comprehension

if/else in Python's list comprehension?

谢谢,

【问题讨论】:

  • 您在尝试使用else时遇到了什么错误?
  • 你不能把它转换成set吗?类似gene_name = list(set([x if 'gene_name' in x else 'NA' for x in attri_values]))
  • 到目前为止,我的尝试没有出错,但我也没有得到我想要的确切内容。我也尝试了 lambda。我可以运行一个 for 循环来解决这个问题,但想学习一个非常好的和干净的方法来解决这个问题。我尝试了旧帖子中的几个示例,到目前为止没有成功。
  • @roganjosh:您的解决方案有效(因为它将相同的值合并为一个值),但我认为如果 NA 在未找到匹配项时仅报告一个值,则可能会出现另一个问题,并且为找到的匹配按原样报告。但是,仍然是一个很好的解决方案。
  • 看起来第二组正在检查“gene_name”。提供的数据在其中的任何地方都不包含“gene_name”——程序正在做你所要求的——列表中的 foreach x,给我x"NA"。通过执行原始理解并检查列表是否为空,您的目标会更好地实现。

标签: python if-statement conditional list-comprehension


【解决方案1】:

您应该在变量赋值中使用or 语句。

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

这样,如果您的初始列表推导返回一个空列表,您将转到 or 的后半部分并将列表 ['NA'] 分配给变量 gene_id

【讨论】:

  • 将示例交换为“gene_name”,我认为这是正确的答案。我认为,“gene_name”的重点是故意获得零匹配。
  • 嗯,是的,但我认为 OP 想要获取gene_id 的列表,如果没有,那么 OP 想要返回单个元素列表。 gene_name 语句只是一个人为的例子。无论如何,方法本身是正确的,可以扩展到任何用例
  • 很公平,另一个答案被误解了。绝对比我在 cmets 中的 set 方法更干净 :)
  • 是的,@roganjosh。这就是我想要的。我正在为一个匹配的值和一个没有任何匹配的值编写代码。我认为这会导致混乱。
猜你喜欢
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2011-11-25
  • 2021-02-16
相关资源
最近更新 更多