使用python的if语句的简单lambda函数

时间:2016-07-18 11:07:11

标签: python lambda

我有1,000个文件;每个文件的开头都是这样的:

!dataset_description = Analysis of POF D119 mutation. 
!dataset_type = Expression profiling by array
!dataset_pubmed_id = 17318176
!dataset_platform = GPL1322

目标:我想将这些信息转换成一个列表,这样我就可以在所有文件之间制作一个excel电子表格;即我希望列表看起来像这样:

[Analysis_of_POF_D119_mutation,Expression_profiling_by_array,17318176,GPL1322]

我有这个代码(这只是提取第一个变量“!dataset_description”,但是,我随后会在每个感兴趣的变量上运行代码,即!dataset_type,!dataset_pubmed_id,!dataset_platform):

OpenDataset = open(sys.argv[1], 'r')
Dataset = OpenDataset.readlines()
ListOfInformation = []
    formatted_line = lambda x: "_".join(line.strip().split("=")[x].split())
    for line in Dataset:
        if line.startswith("!dataset_description"):
            description = formatted_line(1)
            print description

代码有效,但是,我现在处于一个理解python基础知识的阶段,我想开始编写更多“pythonically”。我有两个问题。

  1. 使用我正在使用的lambda表达式似乎很愚蠢。 lambda表达式中的“x”将始终为1,因为我总是想要“=”符号后面的内容。因此,x实际上并不是“变量”,但是如果没有变量,我就不能拥有lambda表达式。
  2. 我试图将变量更改为行开头的变量,这是真正的变量,做这样的事情:

    formatted_line = lambda x: "_".join(line.strip().split("=")[1].split()) if line.startswith(x)
    

    但是,此代码返回语法错误。

    有人知道如何使上述lambda表达式有效。

    1. 这些文件有可能非常大。但是,我需要的信息是在文件的开头,所有信息都以“!”开头。符号。因此,读取整个文件似乎很愚蠢,当我在文件开头只需要X行时,所有行都以“!”开头。 (每个文件的确切行数将是可变的)。有没有办法只读入以“!”开头的行;或者只是使用file.readlines()。

2 个答案:

答案 0 :(得分:2)

你当然可以拥有一个没有参数的lambda表达式。

但是,在这种情况下,您应该实际传递一个参数:行本身。这就是你正在操作的东西,因此它应该传递给函数。

您的if语句不起作用,因为在Python中的内联函数必须始终具有else子句。在这种情况下,else中的值是空字符串。

所以:

formatted_line = lambda line: "_".join(line.strip().split("=")[1].split()) if line.startswith(x) else ""

如果您只想读取值,直到行停止以!开头,您可以使用itertools.takewhile

from itertools import takewhile
...
for line in takewhile(lambda line: line.startswith("!"), Dataset):

答案 1 :(得分:2)

它会引发SyntaxError,因为您错过了else分支。 &#34;表达式如果&#34;或&#34;内联如果&#34;语法如下:<value to return when True> if <condition> else <value when False>您无法使用elif

所以代码可能如下所示:

formatted_line = lambda x: "_".join(line.strip().split("=")[1].split()) if line.startswith(x) else ""  # You can replace this with `None`.