在python中获取两个列表的交集

时间:2014-11-19 00:09:28

标签: python list sorting bioinformatics

我有两个正在分析的基因列表。基本上我想以与维恩图相同的方式对这些列表的元素进行排序,即仅在列表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”模块轻松完成,但出于教育目的,我仍然非常想修复此程序

2 个答案:

答案 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)

您可能还想查看这个方便的网站:

http://jura.wi.mit.edu/bioc/tools/compare.php