如何在每个循环结束时清除此列表?

时间:2014-01-16 21:41:31

标签: python

我试图找到列表中不同子集的最大值。

def max_value(filename):
    CHR=['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', 'X']

    SNP = [ ]

    chr_max=[ ]

    for n in CHR:
        for r in reader:
            if r[1]==n:
                SNP.append(r[2])        #append values into empty list SNP
        SNP = [try_int(x) for x in SNP] #convert to integers
        max_val=max(SNP)                #find the maximum value
        chr_max.append((n, max_val))    #append this maximum to a new list
        del SNP[:]                      #clear the list and loop for next item in CHR list

    return chr_max

我一直在

ValueError: max() arg is an empty sequence

当我删除del SNP [:]步骤时,我得到输出,但它返回n ='1'的最大值(因为它是所有20个循环返回的总体最大值,如果我不空清除清单)。

如何在每个循环结束时清除SNP列表,以便找到列表中不同子集的最大值?

2 个答案:

答案 0 :(得分:1)

如果reader是文件对象或csv.reader()对象,则不能多次循环它并期望它再次从头开始。

例如,文件对象需要以reader.seek(0)重新开头。

因此,第二次代码到达for r in reader:循环时,循环立即终止而不执行任何迭代,没有新元素添加到SNP并且它仍然为空。

您可以将reader iterable中的输入排序为字典而不是继续循环:

CHR=['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', 'X']
values = {c: [] for c in CHR}
for row in reader:
    if row[1] in values:
        values[row[1]].append(try_int(row[2]))

return [max(values[c]) for c in CHR if values[c]]

答案 1 :(得分:1)

您需要撤消readerCHR循环,以便只循环reader一次:

SNPs = {}
for r in reader:
    for n in CHR:
        if r[1]==n:
            SNPs.setdefault(n, []).append(r[2])        #append values into empty list SNP
for n in CHR:
    SNP = SNPs[n]
    # I didn't change anything below here..
    SNP = [try_int(x) for x in SNP] #convert to integers
    max_val=max(SNP)                #find the maximum value
    chr_max.append((n, max_val))    #append this maximum to a new list

注意您也可以使用

from itertools import defaultdict
SNPs = defaultdict(list)

并将附加更改为:

SNPs[n].append(r[2])