我有一个python问题:
假设给定一个向量x
,其中包含大多数为零的实数值。例如:
x = [0.0, 0.87, 0.0, 0.0, 0.0, 0.32, 0.46, 0.0, 0.0, 0.10, 0.0, 0.0]
完成函数compress_vector(x)
,以返回带有两个键d
和d['inds']
的字典d['vals']
,这两个键指示所有位置和值x
的非零条目。对于上一个示例,
d['inds'] = [1, 5, 6, 9]
d['vals'] = [0.87, 0.32, 0.46, 0.10]
注意1.您的实现不得修改输入向量x
。
注2。如果x
仅包含零个条目,则d['inds']
和d['vals']
应该为空列表。
我能够打印索引,但是我不确定如何打印值。
def compress_vector(x):
assert type(x) is list
d = {'inds': [], 'vals': []}
d = ([i for i, e in enumerate(x) if e != 0], )
return d
答案 0 :(得分:3)
您可以按以下方式定义此功能:
def compress_vector(x):
d = {'inds': [], 'vals': []}
for i, e in enumerate(x):
if e != 0:
d['inds'].append(i)
d['vals'].append(e)
return d
基本上,您创建一个dict
,其中'inds'
和'vals'
的值被初始化为空列表。然后,使用enumerate
遍历列表,以获取索引(i
)和元素(e
)。在循环内部,您将元素设置为非零的条件,并将i
和e
附加到先前的列表中。
答案 1 :(得分:2)
您非常亲密。让我们看一下代码的一部分:
i, e in enumerate(x)
此处e
是列表x
中的值,而i
是索引。因此,您可以将列表理解修改为
[e for i, e in enumerate(x) if e != 0]
^
请注意,由于这不需要索引,因此您可以摆脱enumerate()
调用:
[e for e in x if e != 0]
您仍然需要进行一些修改,以将两个列表存储到字典中。
答案 2 :(得分:1)
从枚举的x
中过滤出零,然后使用dict-comprehension从每个元组中提取两个元素。
def compress_vector(x):
enumed = [(i,n) for i,n in enumerate(x) if n]
return {k:[e[i] for e in enumed] for i,k in enumerate(('inds','vals'))}
和测试:
>>> compress_vector(x)
{'inds': [1, 5, 6, 9], 'vals': [0.87, 0.32, 0.46, 0.1]}
答案 3 :(得分:0)
这对我有用。
x = [0.0, 0.87, 0.0, 0.0, 0.0, 0.32, 0.46, 0.0, 0.0, 0.10, 0.0, 0.0]
def compress_vector(x):
d = {'inds': [], 'vals': []}
for i, val in enumerate(x):
if val != 0.0:
d['inds'].append(i)
d['vals'].append(val)
return d
d = compress_vector(x)
答案 4 :(得分:0)
您在这里所做的是将一个元组对象分配给字典对象。注意:
d = ([i for i, e in enumerate(x) if e != 0], )
列表理解的大括号使其成为一个元组。因此,您无法d
拥有此必需的表示形式:
d['inds'] = [1, 5, 6, 9]
d['vals'] = [0.87, 0.32, 0.46, 0.10]
您必须将满足条件的值明确附加到列表中。
def compress_vector(x):
d = dict()
d['inds'] = []
d['vals'] = []
for i, e in enumerate(x):
if e != 0:
d['inds'].append(i)
d['vals'].append(e)
return d
如果没有非零值,则不会将它们附加到列表中,您将获得一个包含空列表的字典。
答案 5 :(得分:0)
解决方案
x = [0.0, 0.87, 0.0, 0.0, 0.0, 0.32, 0.46, 0.0, 0.0, 0.10, 0.0, 0.0]
d = {"inds" : [], "vals" : []}
for i in range(len(x)):
if x[i] != 0:
d["inds"].append(i)
d["vals"].append(x[i])
for k, v in d.items():
print(str(k) + ": " + str(v))
输出
(xenial)vash@localhost:~/pcc/12/alien_invasion_2$ python3 help_print_value_list.py vals: [0.87, 0.32, 0.46, 0.1] inds: [1, 5, 6, 9] (xenial)vash@localhost:~/pcc/12/alien_invasion_2$
评论
只是创建了一些带有条件的循环,如果您有问题,请发表评论。
如果需要的话,这段代码还将帮助您将“ inds”与“ vals”进行匹配,您可以随意操作它,但可以通过以下方式获得想法:
for i in range(len(d["inds"])):
print(str(d["inds"][i]) + ": " + str(d["vals"][i]))
这将输出:
(xenial)vash@localhost:~/pcc/12/alien_invasion_2$ python3 something.py 1: 0.87 5: 0.32 6: 0.46 9: 0.1 (xenial)vash@localhost:~/pcc/12/alien_invasion_2$