我应该用什么数据结构来表示下表
'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
我的两个想法:
最初,我将表表示为子列表列表:
lst = [['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]]
但我无法弄清楚如何进行上述计算(在一个自然或直接的方式(。
sum(lst[0:0+i][1])
不起作用。关于我的方式的问题是如何表示 i 的子列表表中第二列的连续值,其中lst[0:0+i][1]
不起作用。(并排使用两个括号不起作用吗?我有另一个想法,但我不知道如何实现它(有人可以指出它是否可以实现吗?
将上述列表拆分为两个列表,每个列表对应每列。
对第二列列表进行计算
合并第一个列表和第二列列表上的结果。
谢谢。
您可以创建以下函数:
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, 高频 :)