我正在尝试编写一个函数,该函数将使用存储索引和值的矢量数据结构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/

10-08 22:45