我正在尝试编写一个函数,该函数将使用存储索引和值的矢量数据结构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']
中没有出现的任何索引,将在0
中为其分配x
。我正在尝试在长度为
a[index,values]
的零值的新x
行上迭代n
。如果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
而不是浮点数0.
。通过用x = [0] * n
替换x = [0.] * n
可以轻松解决该问题。一般而言:
您应该使用更有意义的变量名,例如
dct
而不是a
,而n
的含义就超出了我的范围。名为newlist
的函数也不是非常有用。关于python - 从带有索引和值的向量数据(字典)创建列表的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45928999/