0

在下面的代码片段中,是否有更 Pythonic 的方式来迭代列表中的每个对象,同时增加另一个对象的索引?我经常使用这个成语,认为有更好的方法。

# Creates a dictionary with normalized values for the dataset.
def exp_pull(sample, gene):
    sample_name = {genes: values for genes, values in 
                    zip([v for i, (j, k) in set_list[int(sample) - 1:int(sample)] 
                    for v in j], mean_values)}
    return round(sample_name.get(gene), 3)


# Pulls normalized expression values for particular genes for all samples.
genes_of_interest = ['ERG', 'ETV1', 'ETV4', 'ETV5']

count = 0
for gene in genes_of_interest:
    print '\n'
    print genes_of_interest[count], ':'
    for file in file_list:
        print file, ": ", exp_pull(file_list.index(file) + 1, 
                                    genes_of_interest[count])
    count += 1    
4

2 回答 2

4

您根本不需要在循环上有索引;您的列表中已经有该gene元素。相反,您希望获得file_list循环的计数器,它会出现,并避免(昂贵的)file_list.index()调用。使用该enumerate()函数可以为您提供:

for gene in genes_of_interest:
    print '\n{}:'.format(gene)
    for i, file in enumerate(file_list):
        print '{}: {}'.format(file, exp_pull(i, gene))

这使用字符串格式以高效和紧凑的方式组合输出。

现在第一个参数始终是一个整数,因此您可以将int()调用放入exp_pull(). 您还只是从 中切出一个元素set_list(),因此通过传入file_list索引(而不是加一),您可以将过于复杂的内容简化exp_pull()为:

def exp_pull(sample, gene):
    if sample >= len(set_list):
        # no such entry in set_list
        return 0.0
    i, (j, k) = set_list[sample]
    sample_name = dict(zip(j, mean_values))
    return round(sample_name.get(gene, 0), 3)

这完全消除了对嵌套理解的需求;我还为sample_name.get()调用添加了一个默认值,round()如果返回正常的默认值,则会引发异常None

我怀疑您程序的其余部分可以进行类似的简化;您可能想在https://codereview.stackexchange.com/上发布它,看看还有什么可以调整的。

于 2013-09-21T10:33:00.437 回答
1

看起来你想要enumerate()

for indx, gene in enumerate(genes_of_interest):
    print '\n'
    print genes_of_interest[indx], ':'
    for indx2, file in enumerate(file_list, 1):
        print file, ": ", exp_pull(indx2, 
                                    genes_of_interest[indx])

但无论哪种方式,这都是没有意义的。您已经在遍历列表,为每个项目赋予gene. 当您可以使用时,无需通过索引访问完全相同的元素gene,例如:

for gene in genes_of_interest:
    print '\n'
    print gene, ':'
    for indx, file in enumerate(file_list, 1):
        print file, ": ", exp_pull(indx, 
                                    gene)

enumerate()接受第二个参数start您可以从n开始,而不是从 0 开始。

于 2013-09-21T10:28:26.500 回答