我有 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 基础知识的阶段,我想开始更“pythonical”地编码。我有两个问题。
- 使用我正在使用的 lambda 表达式似乎很愚蠢。 lambda 表达式中的“x”将始终为 1,因为我总是想要“=”符号后面的内容。因此 x 并不是真正的“变量”,但是我不能没有没有变量的 lambda 表达式。
我试图将变量更改为行开头的内容,这是真正的变量,做这样的事情:
formatted_line = lambda x: "_".join(line.strip().split("=")[1].split()) if line.startswith(x)
但是,此代码返回语法错误。
有人知道如何使上述 lambda 表达式工作吗。
- 这些文件有可能非常大。但是,我需要的信息在文件的开头,并且都是以“!”开头的。象征。所以读入整个文件似乎很愚蠢,当我只需要文件开头的 X 行时,所有这些行都以“!”开头(每个文件的确切行数是可变的)。有没有办法只读以“!”开头的行?还是只使用 file.readlines() 会更快。
最佳答案
您当然可以使用没有参数的 lambda 表达式。
但是,在这种情况下,您实际上应该传递一个参数:行本身。这就是您正在操作的对象,因此应该将其传递到函数中。
您的 if
语句不起作用,因为 Python 中的内联 if 必须始终有一个 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):
关于python - 使用 python 的带有 if 语句的简单 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38435139/