我在第1列中有一个带有AA序列的文件,在第二列中,它出现的次数是我使用Counter()创建的。在第三列中,我有数值,它们都是不同的。第1栏和第2栏中的项目可以相同。
实施例。输入文件:
ADVAEDY 28 0.17805
ADVAEDY 28 0.17365
ADVAEDY 28 0.16951
...
ARYLGYNSNWYPFDY 23 4.16148
ARYLGYNSNWYPFDY 23 3.17716
ARYLGYNSNWYPFDY 23 1.74919
...
ARHLGYNSAWYPFDY 21 10.6038
ARHLGYNSAWYPFDY 21 2.3498
ARHLGYNSAWYPFDY 21 1.68818
...
AGIAFDY 20 0.457553
AGIAFDY 20 0.416321
AGIAFDY 20 0.286349
...
ATIEDH 4 2.45283
ATIEDH 4 0.553351
ATIEDH 4 0.441266
所以这个文件中有197行。第1列中只有48个唯一的AA序列。生成此文件的代码:
input_fh = sys.argv[1] # File containing all CDR(x)
cdr_spec = sys.argv[2] # File containing CDR(x) in one column and specificities in the second
with open(input_fh, "r") as f1:
cdr = [line.strip() for line in f1]
with open(cdr_spec, "r") as f2:
cdr_spec_list = [line.strip().split() for line in f2]
cdr_spec_out = open("CDR" + c + "_counts_spec.txt", "w")
counter_cdr = Counter(cdr)
countermc_cdr = counter_cdr.most_common()
print len(countermc_cdr)
#This one might work:
for k,v in countermc_cdr:
for x,y in cdr_spec_list:
if k == x:
print >> cdr_spec_out, k, '\t', v, '\t', y
cdr_spec_out.close()
我想要生成的输出是,使用上面的示例删除col 1和2中的重复项,但将col 3中的所有mtaching值保留在一行:
ADVAEDY 28 0.17805, 0.17365, 0.16951
...
ARYLGYNSNWYPFDY 23 4.16148, 3.17716, 1.74919
...
ARHLGYNSAWYPFDY 21 10.6038, 2.3498, 1.68818
...
AGIAFDY 20 0.457553, 0.416321, 0.286349
...
ATIEDH 4 2.45283, 0.553351, 0.441266
此外,对于" new"的每个逗号分隔值。 col 3我需要它们按从大到小的顺序排列。我宁愿远离模块,因为我还在学习python和" pythonic"做事的方式。
感谢任何帮助。
答案 0 :(得分:0)
导致相同AA再次打印的原因是循环的第二个:
for x,y in cdr_spec_list:
尝试从头开始加载cdr_spec_list作为字典:
with open(cdr_spec, "r") as f2:
cdr_spec_dic = defaultdict(list) #a dictionary with the default value of list
for ln in f2:
k,v = ln.strip().split()
cdr_spec_dic[k].append(v)
现在您有一个从每个AA序列到您要呈现的数值的字典。 所以现在,我们不需要第二个for循环,我们也可以在我们那里进行排序。
for k,v in countermc_cdr:
print >> cdr_spec_out, k, '\t', v, '\t', ' '.join(sorted(cdr_spec_dic[k]))