我试图找到列表中不同子集的最大值。
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列表,以便找到列表中不同子集的最大值?
答案 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)
您需要撤消reader
和CHR
循环,以便只循环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])