So I have a few files that look like:

snpID  Gene
rs1  ABC1
rs2  ABC1
rs3  ABC25
rs4  PT4
rs5  MTND24

在不同的文件中将有其他snpID和基因对,但对于给定的snpID可能有重复,但相关的相应“基因”可能不同。例如:
snpID  Gene
rs100  URX1
rs95  KL4
rs1  ABC1
rs2  ABC1-MHT5
rs3  ABC25
rs4  PT4-FIL42

我想做的是附加文件的所有内容,如果它们有相同的snpID和基因对,则删除重复的内容。然而,如果snpID的对应基因不同,它必须进入同一行
对于上面的示例,应该如下所示:
snpID  Gene
rs1  ABC1
rs2  ABC1, ABC1-MHT5
rs3  ABC25
rs4  PT4, PT4-FIL42
rs5  MTND2
rs100  URX1
rs95  KL4

我想我可以通过创建字典来实现这一点。
import glob
file_list = glob.glob('annotations.*')
dict_snps_genes = {}
for filename in file_list:
    with open(filename) as fileA:
        for line in fileA:
            col0 = line.split()[0]
            col1 = line.split()[1]
            dict_snps_genes[col0] = col1

unique_dict_snps = {}
for key,value in dict_snps_genes:
    if key not in unique_dict_snps.keys():
        unique_dict_snps_genes[key] = value

我在继续前进之前测试了这个,这给了我一个错误,比如:
ValueError: too many values to unpack

注:每个文件大约有8000个snpId基因对,有5个以上的文件
关于如何克服这些的想法!!

最佳答案

You are looping over keys, but trying to assign those to both a key and value variable:

for key,value in dict_snps_genes:

将其更改为循环:
for key,value in dict_snps_genes.items():

或者更好的方法是,如果在Python 2.x上使用`.iteritems():
for key,value in dict_snps_genes.iteritems():

注意,在读取文件的方式中,只存储任何给定snpID的最后一个读取基因;如果找到该id的另一个条目,则覆盖前一个。
就我个人而言,我会使用.items()collections.defaultdict()默认值:
import glob
import collections

file_list = glob.glob('annotations.*')
snps_genes = collections.defaultdict(set)
for filename in file_list:
    with open(filename) as fileA:
        for line in fileA:
            snpid, gene = line.strip().split(None, 1)
            snps_genes[snpid].add(gene)

现在set中的值是一组基因,每个都是唯一的。注意,我在空白(snps_genes)上将您的行分成两部分,这样,如果基因值中有空白,它将按如下方式存储:
>>> 'id gene with whitespace'.split(None, 1)
['id', 'gene with whitespace']

Python使用“snpid,gene”作为左边的赋值表达式,获取分割的结果,并将每个片段赋给一个单独的变量;这是保存一行代码的一个简便技巧。
。Here is one that sorts everything:
for id in sorted(snps_genes):
    print id, ', '.join(sorted(snps_genes[id]))

10-04 18:22