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。