用于对接下来的几项求和的数据类型



我应该用什么数据结构来表示下表

'a', 1
'b', 2
'c', 3
'd', 4
'e', 5

因此,计算接下来 i 行中第二项的总和似乎是很自然的:

例如,当 i=1 时

'a', 2
'b', 3
'c', 4
'd', 5

当 i=2 时

'a', 2+3=5
'b', 3+4=7
'c', 4+5=9

当 i=3 时

'a', 2+3+4=9
'b', 3+4+5=12

当 i=4 时

'a', 2+3+4+5=14

我的两个想法:

  1. 最初,我将表表示为子列表列表:

    lst = [['a', 1],
    ['b', 2],
    ['c', 3],
    ['d', 4],
    ['e', 5]]
    

    但我无法弄清楚如何进行上述计算(在一个自然或直接的方式(。 sum(lst[0:0+i][1])不起作用。关于我的方式的问题是如何表示 i 的子列表表中第二列的连续值,其中 lst[0:0+i][1]不起作用。(并排使用两个括号不起作用吗?

  2. 我有另一个想法,但我不知道如何实现它(有人可以指出它是否可以实现吗?

    • 将上述列表拆分为两个列表,每个列表对应每列。

    • 对第二列列表进行计算

    • 合并第一个列表和第二列列表上的结果。

谢谢。

您可以创建以下函数:

def my_sum(l, i):
    return [
        [x[0], sum(y[1] for y in l[j: j + i])] for j, x in enumerate(l[:-i], 1)
    ]

例子:

>>> my_sum(lst, 1)
[['a', 2], ['b', 3], ['c', 4], ['d', 5]]
>>> my_sum(lst, 2)
[['a', 5], ['b', 7], ['c', 9]]
>>> my_sum(lst, 3)
[['a', 9], ['b', 12]]
>>> my_sum(lst, 4)
[['a', 14]]

编辑

基于第二个想法的实现,使用numpy

import numpy as np
def my_sum(l, i):
    a, b, n = [v[0] for v in lst], np.array([v[1] for v in lst]), len(l)
    sums = np.zeros(n, dtype=np.int)
    for j in xrange(1, i + 1):
        sums[:n - j] += b[j: n]
    return zip(a[:-i], sums[:-i])

本身并不是真正的"数据结构",但你可以尝试这样的事情:

labels = ['a','b','c','d','e']
vals = [1, 2, 3, 4, 5]
def foo(i):
    for j in range(len(vals)-i):
        print labels[j], sum(vals[j+1:j+1+i])

你也可以把整个事情卷到一个类中。

您可以使用字典。它们具有将值存储到变量的键和值。您可以将函数和其他变量作为键。

mydata = {'a': 1, 'b': 2 # and so on...
         }
>>> mydata['a']
1

对于计算,我不完全确定如何做到这一点......您可以使用mydata.itervalues()并获取所有值,然后将内容重新分配给键,如果您知道如何处理数字(我不完全确定数字发生了什么(。

编辑:

由于字典未排序,因此您可以使用collections.OrderedDict .当它记得插入密钥时,这可能是一个很好的应用程序。如果您不能使用它,内置的sorted()函数也可能很有用。

不那么简洁,

import operator
letter = operator.itemgetter(0)
number = operator.itemgetter(1)
lst = [['a', 1],   ['b', 2], ['c', 3],  ['d', 4],  ['e', 5]]
x = 3
for i, thing in enumerate(lst, 1):
    n = sum(number(other) for other in lst[i:i+3])
    print letter(thing), n 
a 9
b 12
c 9
d 5
e 0

您已经在使用一个结构 - 一个列表。列表推导是答案:

def sum_next_few(lst, i):
    return [[x[0], sum(map(lambda y: y[1], lst[lst.index(x)+1:lst.index(x)+i+1]))] for x in lst[:-i]]

格式化代码:

def sum_next_few(lst, i):
    return [[
            x[0],
            sum(
                map(lambda y: y[1], lst[lst.index(x)+1:lst.index(x)+i+1])
            )] for x in lst[:-i]]

或更具描述性的版本:

def sum_next_few(lst, i):
    result = []
    # We will add numbers to positions that are having successors
    for x in lst[:-i]:
        idx = lst.index(x)
        # Our string
        st = x[0]
        # Our sum
        sm = sum(map(lambda y: y[1], lst[idx+1:idx+i+1]))
        result.append([st, sm])
    return result

以上解决方案以及您问题的输入:

lst = [['a', 1],
['b', 2],
['c', 3],
['d', 4],
['e', 5]]
>>> sum_next_few(lst, 1)
[['a', 2], ['b', 3], ['c', 4], ['d', 5]]
>>> sum_next_few(lst, 2)
[['a', 5], ['b', 7], ['c', 9]]
>>> sum_next_few(lst, 3)
[['a', 9], ['b', 12]]
>>> sum_next_few(lst, 4)
[['a', 14]]
>>> sum_next_few(lst, 5)
[]

GL, 高频 :)

最新更新