我正在尝试编写一个函数,该函数将使用向量数据结构 a
来存储索引和值,并将其转换为新列表。新列表还将汇总具有重复索引的所有值。此外,a
可以是任意长度。
例如:
a = {'index': [], 'value': []}
a['index'] = [0, 2, 7, 2, 2, 5, 1]
a['value'] = [1.0, 2.0, 3.0, 4.0, 8.0, 6.0, 7.0]
期望的输出是:
x = [1.0, 7.0, 14.0, 0.0, 0.0, 6.0, 0.0, 3.0]
对于索引 2,它的总和为 14(2、4 和 8)。对于未出现在 a['index']
中的任何索引,它将在 x
中分配为 0
。
我正在尝试在长度为 n
的零值的新 x
行上迭代 a[index,values]
。如果 x[i]
已经存在,它将求和到现有值。我知道我的 for 语句有点不对劲,但我不确定如何在语法上修复它:
def newlist(a, n=None):
i_max = max(a['index']) if a['index'] else -1
if n is None:
n = i_max+1
else:
assert n > i_max,
x = [0] * n
for i, v in zip(a['index'], a['value']):
if x[i] in a['index']:
x[i]+=v
else:
x[i]=v
return x
最佳答案
该列表已包含零,因此您始终可以只添加值(因为 0+v
与将其设置为 v
相同)。通过该修改,函数将如下所示:
def newlist(a, n=None):
i_max = max(a['index']) if a['index'] else -1
if n is None:
n = i_max+1
else:
assert n > i_max
x = [0] * n
for i, v in zip(a['index'], a['value']):
x[i] += v
return x
它返回你所期望的:
>>> newlist(a)
[1.0, 7.0, 14.0, 0, 0, 6.0, 0, 3.0]
所需输出有一处不同,使用整数 0
而不是 float 0.
。这可以通过将 x = [0] * n
替换为 x = [0.] * n
轻松解决。
更一般的说明:
你应该使用更有意义的变量名,比如 dct
而不是 a
而 n
应该意味着什么,我不明白。名为 newlist
的函数也不是很有用。
关于python - 从具有索引和值的矢量数据(字典)创建列表的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45928999/