如何在此脚本中的for循环中使用for循环?

时间:2013-10-02 10:02:35

标签: python-2.7 for-loop dictionary

我正在尝试编写一个脚本,该脚本从包含蛋白质ID的文件中创建字典列表。 这是我直到现在所写的:

#import packages
import sys

#get the file from the command line
map_file =  sys.argv[1]


#create dictionaries containing the different proteins IDs
def get_mapping(map_file):
        file = open(map_file)
    result = list() 
    column_count = file.readline().split('\t')  
    n = len(column_count)
    for i in range(n-1):
        result.append({})
    for line in file:
        word = line.split('\t')
        for w in range(n):
            if word[n-1] <> word[0]:
                result[n-2][word[n-1]] = word[0]
            n = n-1         
    return result

print get_mapping(map_file)

因此输入文件包含许多行,每行包含2-4种不同的特定蛋白质ID。我想创建一个字典列表,其中第一行ID为值,其中一个ID为键。 当我运行这个脚本它完全按照我想要的方式执行,但仅适用于输入文件中的第一行。我需要更改什么才能为输入文件中的每一行执行此操作?

蛋白质文件如下所示:

Ensembl_Protein_ID UniProt/SwissProt_Accession UniProt/TrEMBL_Accession RGD_ID 
ENSRNOP00000000008 P18088 C9E895 2652 
ENSRNOP00000000008 P18088 B3VQJ0 2652 
ENSRNOP00000000009 D3ZEM1 1310201 
ENSRNOP00000000025 B4F7C7 
ENSRNOP00000000029 Q9ES39 620038 
ENSRNOP00000000037 Q7TQM3 735156 
ENSRNOP00000000052 O70352 Q6IN14 69070 
ENSRNOP00000000053 Q9JLM2 68400 
ENSRNOP00000000064 P97874 621589 
ENSRNOP00000000072 P29419 621377 
ENSRNOP00000000074 B2RZ28 1304584 
ENSRNOP00000000078 D3ZDI7 1308022 
ENSRNOP00000000080 Q5XI68 1305201 
ENSRNOP00000000085 D3ZDH7

1 个答案:

答案 0 :(得分:0)

您在内部n循环中递减for但不将其重置为原始值。只需在n = len(column_count)循环之前或之后添加for w in range(n):即可。或者甚至更好,直接使用w变量,而不是减少n

for w in range(1, len(word)):
    if word[w] <> word[0]:
        result[w-1][word[w]] = word[0]

另外,请注意column_count = file.readline().split('\t')可能是个问题:首先,从您的问题判断,不清楚第一行是否会保持每行的最大字数;第二,请注意,在第二个for line in file循环中,此行将再次读取,因此,除非这是某种标题行,否则某些ID将丢失。 更新: 标题,列出了所有列,所以这是完全可以的。

最后,您应该关闭文件(在方法末尾添加file.close()),或使用with statement,它会为您处理此问题。在此块结束时,文件将自动正确关闭。

with open(map_file) as f:
    # your code