如何在列下的整数中设置区间,然后将相应的值汇总到区间?

时间:2017-08-02 07:06:02

标签: python string python-3.x

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)`

但这只是打印我{}而不是我想要的。

有人可以指出我的错误吗?

非常感谢。

1 个答案:

答案 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()]