Key Type Size Value
1000001 str 1 -2
1000031 str 1 -1
1000040 str 1 -1
1000052 str 1 -4
1000053 str 1 -2
1000065 str 1 -1
1000066 str 1 -2
1000074 str 1 -1
1000077 str 1 -1
1000101 str 1 -1
大家好,几周前我刚开始玩python,现在看来我在这里面临死胡同。
我有一组表格,我必须在'Key'列下对与整数范围(间隔为100)相对应的'Values'求和,即1000001 - 100101之间的'Value'之和为-16。
“Key”列的范围最大为~2000000,我在使用range()语句迭代间隔(100)时遇到麻烦......
到目前为止,这是我的编码:
f = open("Exercise.gff", 'r')
temp = f.readlines()
f.close()
temp2 = []
for string in temp:
a = string.split('\t')
temp2.append(a)
fwd, rev = {}, {}
for i in temp2:
strand = i[6]
position = i[3]
value = i[5]
if strand == '+':
fwd[position] = value
elif strand == '-':
rev[position] = value
else:
print ('error')
break
'''我设法获得上面编码的表,现在我想以100的间隔分隔'Key'列,并计算'Value'的总和位于'Key'的相应范围内''
summation = {}
for df in fwd:
column = df[0]
integers = df[3]
while df[0] in range([1], 2000000, [100]):
print(df[0])
df[0] += 100
summation[position] = sum(integers)`
但这只是打印我{}而不是我想要的。
有人可以指出我的错误吗?
非常感谢。
答案 0 :(得分:0)
您可以使用n // 100 * 100
将键向下舍入到下一百(或者只是将它们保留为字符串并使用s[:-2]
删除最后两位数字,无论您喜欢哪种方式),然后将它们分组字典,或collections.defaultdict
,并计算总和。
groups = collections.defaultdict(int)
for k, t, s, v in data:
groups[int(k) // 100 * 100] += int(v)
或者,如果数据已经按key
排序,那么您可以使用itertools.groupby
:
groups = {k: sum(int(v[3]) for v in vs)
for k, vs in itertools.groupby(data, key=lambda d: int(d[0]) // 100 * 100)}
结果,在两种情况下都是{1000000: -15, 1000100: -1}
,使用data
作为
text = """1000001 str 1 -2
1000031 str 1 -1
1000040 str 1 -1
1000052 str 1 -4
1000053 str 1 -2
1000065 str 1 -1
1000066 str 1 -2
1000074 str 1 -1
1000077 str 1 -1
1000101 str 1 -1"""
data = [line.split() for line in text.splitlines()]