3 回答
TA贡献1851条经验 获得超5个赞
关于PyCharm警告(问题是关于的)
虽然2次指数(C ^)被高亮显示,让用户觉得这是问题,它不是有关,在所有。
通常,列表是同类容器,这意味着它们包含相同类型的元素。
PyCharm评价v_f_vector为的列表的列表INT小号(并因此v_f_vector[b][c]
作为INT)。尝试为其分配一个字符串,会破坏列表的同质性,因此会发出警告。
尝试为其分配虚拟值(例如0.01f
, ()
, []
, ...),警告文本将更改,如下图所示:
作为一种快速(和肮脏)的解决方法,如果列表将包含字符串,您可以执行以下操作:
v_f_vector = [["", "", "", ""], ["", "", "", "", "", "", "", ""], ["", "", "", ""], ["", "", "", "", ""]]
关于导致此问题的代码
声明具有特定内容的列表,然后返回并更改该内容(基于另一个(类似结构的)列表)是违反直觉的。
你(完)目标,可以实现一个代码行(最Python的IC形式),由的列表解析(检查[Python的3.Docs]:列表综合)。由于您的列表嵌套级别为 2,因此理解将是:
>>> aggregated_vector = [[0, 8, 0, 6], [0, 1, 0, 0, 0, 0, 9, 0], [0, 0, 10, 0], [0, 10, 0, 0, 0]]
>>> class_count = 10
>>>
>>> vote_fraction = [[f"{(item1 / class_count): .2F}" for item1 in item0] for item0 in aggregated_vector]
>>> print(vote_fraction)
[[' 0.00', ' 0.80', ' 0.00', ' 0.60'], [' 0.00', ' 0.10', ' 0.00', ' 0.00', ' 0.00', ' 0.00', ' 0.90', ' 0.00'], [' 0.00', ' 0.00', ' 1.00', ' 0.00'], [' 0.00', ' 1.00', ' 0.00', ' 0.00', ' 0.00']]
>>>
>>> # Or, if you REALLY need to have a function
...
>>> def get_vote_fraction(cl_count, ag_vector):
... return [[f"{(item1 / cl_count): .2F}" for item1 in item0] for item0 in ag_vector]
...
>>>
>>> print(get_vote_fraction(class_count, aggregated_vector))
[[' 0.00', ' 0.80', ' 0.00', ' 0.60'], [' 0.00', ' 0.10', ' 0.00', ' 0.00', ' 0.00', ' 0.00', ' 0.90', ' 0.00'], [' 0.00', ' 0.00', ' 1.00', ' 0.00'], [' 0.00', ' 1.00', ' 0.00', ' 0.00', ' 0.00']]
注意:您的代码也可以进行调整,但我建议使用推荐的变体。
TA贡献1966条经验 获得超4个赞
我认为警告来自您用字符串替换整数值的事实。当我尝试v_f_vector使用'0'而不是实例化时0,PyCharm 没有显示任何警告:
v_f_vector = [['0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '0', '0', '0']]
但是,这可能不是解决问题的最佳方法。我建议对您的代码进行这样的重构:
def get_vote_fraction(cl_count, ag_vector):
v_f_vector = []
for b in range(0, len(ag_vector)):
v_f_vector.append([])
for c in range(0, len(ag_vector[b])):
v_f_vector[b].append(f"{(ag_vector[b][c] / cl_count): .2F}")
return v_f_vector
aggregated_vector = [[0, 8, 0, 6], [0, 1, 0, 0, 0, 0, 9, 0], [0, 0, 10, 0], [0, 10, 0, 0, 0]]
class_count = 10
vote_fraction = get_vote_fraction(class_count, aggregated_vector)
print(vote_fraction)
它将允许您在aggregated_vector不将这些更改反映到实例化的情况下进行更改v_f_vector。
TA贡献1842条经验 获得超12个赞
你应该使用 enumerate()
例子:
iterable = [1,2,3,4]
for i, v in enumerate(iterable):
print(i,v)
预期输出
0 1
1 2
2 3
3 4
代替
for x in range(0, len(iterable)):
print(x, iterable[x])
抱歉,这并不是您问题的真正答案,但这样更易于阅读,而且,枚举将始终为您提供索引和值,或者如果它是字典,则是键和值。
可能还值得注意的是,将列表嵌套在字典中,然后为每个列表提供一个特定的键,以便您可以访问它们,这使人类可读性更高。
只是深思熟虑
为了更清晰,假设您有 4 个向量,向量 a、b、x 和 y。您可以将它们各自的列表放在自己的字典键中,然后使用它们的键访问它们。
添加回答
举报