我有两个正在分析的基因列表。基本上我想以与维恩图相同的方式对这些列表的元素进行排序,即仅在列表1中出现的元素放在一个列表中,仅在列表2中的元素放在另一个列表中,而在两个列表中出现的元素放在一个列表中第三
到目前为止我的代码:
from Identify_Gene import Retrieve_Data #custom class
import argparse
import os
#enable use from command line
parser = argparse.ArgumentParser(description='''\n\nFind the intersection between two lists of genes\n ''')
parser.add_argument('filename1',help='first list of genes to compare')
parser.add_argument('filename2',help='second list of genes to compare')
parser.add_argument('--output_path',help='provide an output filename')
args = parser.parse_args()
os.chdir(args.output_path)
a = Retrieve_Data() # custom class, simply produces a python list
list1 = a.parse_gene_list(args.filename1)
list2 = a.parse_gene_list(args.filename2)
intersection = []
list1_only = []
list2_only = []
if len(list1)>len(list2):
for i in range(0,len(list1)):
if list1[i] in list2:
intersection.append(list1[i])
else:
list1_only.append(list1[i])
for i in range(0,len(list2)):
if list2[i] not in list1:
list2_only.append(list2[i])
else:
for i in range(0,len(list2)):
if list2[i] in list1:
intersection.append(list2[i])
else:
list2_only.append(list2[i])
for i in range(0,len(list1)):
if list1[i] not in list2:
list1_only.append(list2[i])
filenames = {}
filenames['filename1'] = 'list1_only.txt'
filenames['filename2'] = 'list2_only.txt'
filenames['intersection'] = 'intersection.txt'
with open(filenames['filename1'],'w') as f:
for i in range(0,len(list1_only)):
f.write(list1_only[i]+'\n')
with open(filenames['filename2'],'w') as f:
for i in range(0,len(list2_only)):
f.write(list2_only[i]+'\n')
with open(filenames['intersection'],'w') as f:
for i in range(0,len(intersection)):
f.write(intersection[i]+'\n')
这个程序目前给我两个相同的列表,如list1_only和list2_only,它们应该是互斥的。产生的交集文件是不同的,虽然我觉得它不可信任,因为其他两个列表的行为不符合预期。
我已被告知(自发布此问题以来)此操作可以通过python“Sets”模块轻松完成,但出于教育目的,我仍然非常想修复此程序
答案 0 :(得分:1)
列表构建存在错误。
在以下部分:
for i in range(0,len(list1)):
if list1[i] not in list2:
list1_only.append(list2[i])
最后一行应该是:
list1_only.append(list1[i])
答案 1 :(得分:0)
您可能还想查看这个方便的网站: