我有一个函数可以为我的数据计算“或”类型的列表。
keyword = sys.argv[1] # a name from the Name column
def exon_coords():
exon_start_plus = [] # Plus strand coordinates
exon_start_minus = [] # Minus strand coordinates
for line in csv.reader(sys.stdin, csv.excel_tab):
if len(line) >= 1:
if re.search(keyword, str(line)): # If arg keyword exists in file
if line[3] == "-": # If the DNA strand is a minus strand
chrompos = line[0] + ";" # Get the chromosome position
exon_start_minus.append(chrompos+line[1]) # Full exon position
else: # all other lines are plus strands
chrompos = line[0] + ";"
exon_start_plus.append(chrompos+line[1])
return exon_start_minus, exon_start_plus #Return lists目标是编写一个包含坐标的输出文本文件。
with open(keyword+"_plus.txt", "w") as thefile:
for item in exon_start_plus:
thefile.write("{}, ".format(item))或者,如果关键字导致了负线:
with open(keyword+"_minus.txt", "w") as thefile:
for item in exon_start_minus:
thefile.write("{}, ".format(item))我试着把这些写文件放在代码中,但是返回函数不会给我完整的列表,我每次只写一个坐标。我将它们放在末尾,但这会导致空文件和空字符串-我希望将此作为一个函数,并让它确定关键字(即基因ID)是否具有给定的正/负链坐标(我有一个包含此数据的巨大数据文件,重点是不手动扫描ID并查看它们是否为正/负DNA链)。
谢谢!
编辑(示例数据,必须删除一些列,所以我也编辑了代码):
Position Start End Strand Overhang Name
1 3798630 3798861 + . ENSPFOG0000001
1 3799259 3799404 + . ENSPFOG0000001
1 3809992 3810195 + . ENSPFOG0000001
1 3810582 3810729 + . ENSPFOG0000001
2 4084800 4084866 - . ENSPFOG0000002
2 4084466 4084566 - . ENSPFOG0000002
2 4084089 4084179 - . ENSPFOG0000002因此,如果我使用ENSPFOG0000001作为我的关键字,那么脚本应该运行并确定线束是正的,收集列表中的起始坐标,然后输出一个只包含这些坐标的文件。该文件将附加keyword+"_plus.txt“。如果它是ENSPFOG0000002,那么它将收集负链坐标,并创建一个文件,在其中创建keyword+"_minus.txt“。
发布于 2017-07-25 03:56:42
空列表的计算结果为False:
>>> exon_start_minus, exon_start_plus = [], []
>>> bool(exon_start_minus), bool(exon_start_plus)
(False, False)
>>> exon_start_minus, exon_start_plus = [1], []
>>> bool(exon_start_minus), bool(exon_start_plus)
(True, False)
>>> exon_start_minus, exon_start_plus = [1], [1]
>>> bool(exon_start_minus), bool(exon_start_plus)
(True, True)
>>> exon_start_minus, exon_start_plus = [], [1]
>>> bool(exon_start_minus), bool(exon_start_plus)
(False, True)因此,您可以测试空列表并采取适当的操作
>>> if exon_start_plus:
print('!!!')
!!!
>>> if exon_start_minus:
print('!!!')
>>> 要从函数检索两个列表,请执行以下操作:
exon_start_minus, exon_start_plus = exon_coords()https://stackoverflow.com/questions/45285609
复制相似问题