稀疏向量是一个向量几乎全为零的向量,如[1, 0, 0, 0, 0, 0, 0, 2, 0]
。存储所有那些零浪费内存和字典通常用于跟踪非零条目。例如,前面显示的向量可以表示为{0:1, 7:2}
,因为它要表示的向量在索引1
处具有值0
而在索引处具有值2
7
。编写一个将稀疏向量转换为字典的函数,如上所述。
实施例
>>> 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])
{}
我的代码
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])
代码将其作为
返回{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}
{}
任何帮助?
答案 0 :(得分:3)
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])
答案 1 :(得分:2)
使用条件字典理解的单行:
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},
{}]
压缩结束时的 if val
意味着如果val不计算为False(即它不是0,None等),它只会将键和值添加到字典中。
enumerate(v)
遍历可迭代对象(例如列表)并返回其索引值以及该位置的对象/值。
n: val
将值添加到键入索引值n
的字典中(仅当val
不为零/无时)。
答案 2 :(得分:1)
你的钥匙都错了。你现在拥有的是values in input -> last index that value appears
字典。你想要得到的是values in input: count of each value
的字典。两者都不是稀疏列表(要获得第二个,请将d[c] = k
更改为d[c] += 1
)。
然而,你走在正确的轨道上。您需要做的是浏览输入列表,跟踪您所在的索引和该索引处的数字。 enumerate()
非常适合这一点。但是,你需要做的是有一个index in original list: value at that index
的字典,其中值不是0.试着仔细考虑你的每个变量意味着什么,以及结果结果如何成为。
我会帮助你更多(事实上,你可以在single dictionary comprehension中完成这个),但这看起来像是一个家庭作业问题(即使不是,也有很多价值)通过自己解决这个问题),所以我对发表一个完整的答案表示怀疑。
答案 3 :(得分:1)
def convertVector(numbers):
dic = {}
for i in range(len(numbers)):
if numbers[i] != 0:
dic[i] = numbers[i]
return dic
答案 4 :(得分:0)
看看人们给你的一些很棒的建议。解决问题的一种方法是:
def convertVector(numbers):
Value = []
for number, w in enumerate(numbers):
if w != 0:
Value.append((number, w))
return dict(Value)