python中的稀疏向量?

python中的稀疏向量?,python,python-2.7,Python,Python 2.7,稀疏向量是一种其条目几乎全部为零的向量,如[1,0,0,0,0,0,0,2,0]。存储所有这些零会浪费内存,字典通常只用于跟踪非零条目。例如,前面显示的向量可以表示为{0:1,7:2},因为它要表示的向量在索引0处具有值1,在索引7处具有值2。编写一个函数,如上所述将稀疏向量转换为字典 示例 >>> convertVector([1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4]) {0: 1, 3: 2, 7: 3, 12: 4} >>&

稀疏向量是一种其条目几乎全部为零的向量,如
[1,0,0,0,0,0,0,2,0]
。存储所有这些零会浪费内存,字典通常只用于跟踪非零条目。例如,前面显示的向量可以表示为
{0:1,7:2}
,因为它要表示的向量在索引
0
处具有值
1
,在索引
7
处具有值
2
。编写一个函数,如上所述将稀疏向量转换为字典

示例

>>> convertVector([1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4])
{0: 1, 3: 2, 7: 3, 12: 4}
>>> convertVector([1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0])
{0: 1, 2: 1, 4: 2, 6: 1, 9: 1}
>>> convertVector([0, 0, 0, 0, 0])
{}
{0: 11, 1: 0, 2: 3, 3: 7, 4: 12}
{0: 10, 1: 9, 2: 4}
{0: 4}
我的代码

def convertVector(numbers):
    d = {i: 0 for i in numbers}
    for k, c in enumerate(numbers):
        d[c] = k  # increment its value

    return d
print convertVector([1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4])
print convertVector([1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0])
print convertVector([0, 0, 0, 0, 0])
返回为的代码

>>> convertVector([1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4])
{0: 1, 3: 2, 7: 3, 12: 4}
>>> convertVector([1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0])
{0: 1, 2: 1, 4: 2, 6: 1, 9: 1}
>>> convertVector([0, 0, 0, 0, 0])
{}
{0: 11, 1: 0, 2: 3, 3: 7, 4: 12}
{0: 10, 1: 9, 2: 4}
{0: 4}
问题是它返回的是最后一个索引,对应于该值。它应该在哪里返回

   {0: 1, 3: 2, 7: 3, 12: 4}
    {0: 1, 2: 1, 4: 2, 6: 1, 9: 1}
    {}

有什么帮助吗?

你的钥匙都错了。您现在拥有的是输入->最后一个索引中出现的
值的字典。您试图获得的是输入中
值的字典:每个值的计数
。两者都不是稀疏列表(要获得第二个列表,请将
d[c]=k
更改为
d[c]+=1

def convertVector(numbers):
    d = {}
    for k, c in enumerate(numbers):
        if c:
            d[k] = c  
    return d

print convertVector([1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4])
print convertVector([1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0])
print convertVector([0, 0, 0, 0, 0])
然而,你走在正确的轨道上。你需要做的是浏览输入列表,跟踪你所在的索引和该索引的编号
enumerate()
非常适合这一点。但是,您需要做的是在原始列表中有一个索引为
的字典:该索引的值不为0。试着准确地思考每个变量的含义,以及结果是什么


我会帮你更多(事实上,你可以在a中这样做),但这看起来确实像是一个家庭作业问题(即使不是,通过你自己解决这个问题也有很大的价值),所以我对发布完整答案持怀疑态度。

使用条件词典理解的一行文字:

def sparseVector(v): 
    return {n: val for n, val in enumerate(v) if val}

 v1 = [1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4]
 v2 = [1, 0, 1 , 0, 2, 0, 1, 0, 0, 1, 0]
 v3 = [0, 0, 0, 0, 0]

 >>> [sparseVector(v) for v in [v1, v2, v3]]
 [{0: 1, 3: 2, 7: 3, 12: 4}, 
  {0: 1, 2: 1, 4: 2, 6: 1, 9: 1}, 
  {}]
如果压缩结束时的val
意味着,如果val的计算结果不为False(即,它不是0、无等),它将只向字典添加键和值

enumerate(v)
遍历一个iterable对象(例如列表),并返回其索引值以及该位置的对象/值


n:val
将值添加到索引值
n
上键入的字典中(仅当
val
不是零/无时)。

看看上面人们给你的一些很棒的建议。解决此问题的一种方法是:

    def convertVector(numbers):
        Value = []
        for number, w in enumerate(numbers):
            if w != 0:
                Value.append((number, w))
        return dict(Value)

看起来您需要在此处进行一些橡皮鸭调试()。解释函数的每一行的作用,以及它返回这些值的原因。你应该能够回答你自己的问题。创建一个
d
threre有什么意义?我知道为什么它会返回值的最后一个索引,因为for循环,当它出现在字典中时,它应该返回值的索引,对不起,糟糕的英语:DYeah,但是为什么?你应该解释一下为什么这样做是正确的,因为这个问题显然是一个学习练习。你能解释一下吗?
如果c:
更像python。