我有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”。我有两个问题。
我试图将变量更改为行开头的变量,这是真正的变量,做这样的事情:
formatted_line = lambda x: "_".join(line.strip().split("=")[1].split()) if line.startswith(x)
但是,此代码返回语法错误。
有人知道如何使上述lambda表达式有效。
答案 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`.