范围()中的计数器不被识别为整数

问题描述 投票:5回答:3

我试图使用嵌套for循环逐步浏览每个列表的每个元素上运行的列表。我收到来自PyCharm的警告,第二个for循环中的计数器类型不一定是整数,尽管它是从范围值派生的。代码执行正确,为什么警告?

def get_vote_fraction(cl_count, ag_vector):
    v_f_vector = [[0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0]]
    for b in range(0, len(v_f_vector)):
        for c in range(0, len(v_f_vector[b])):
            v_f_vector[b][c] = 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)

正如预期的那样,输出为[['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']]

我得到一个警告,即v_f_vector [b] [c]中的c可能是Unexpected类型(int,str),其中c表示没有充分定义为整数。我对PyCharm的问题犹豫不决,因为我可能会遗漏一些简单的东西。有人看到我错过了吗?

python types pycharm warnings
3个回答
2
投票

关于PyCharm警告(问题是关于)

虽然第二个索引(c)突出显示,让用户认为这是问题所在,但根本不是这个问题。

通常,列表是同类容器,这意味着它们包含相同类型的元素。 PyCharm将v_f_vector评估为整数列表(因此v_f_vector[b][c]为int)。试图给它分配一个字符串,会破坏列表的同质性,从而产生警告。 尝试为其分配虚拟值(例如0.01f()[],...),警告文本将更改,如下图所示:

Img0

作为快速(和脏)的解决方法,如果列表将包含字符串,您可以执行以下操作:

v_f_vector = [["", "", "", ""], ["", "", "", "", "", "", "", ""], ["", "", "", ""], ["", "", "", "", ""]]

关于导致这一点的代码

声明具有特定内容的列表,然后返回并更改该内容(基于另一个(类似结构)列表)是违反直觉的。

你的(最终)目标,可以在一行代码(最Pythonic形式)中实现,包括列表理解(检查[Python 3]: List Comprehensions)。由于您的列表嵌套级别为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']]

注意:您的代码也可以调整,但我建议您使用推荐的变体。


1
投票

我认为警告来自你用字符串替换整数值的事实。当我试图用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)

它将允许您更改qazxsw poi而不将这些更改反映到实例化的qazxsw poi。


0
投票

你应该使用aggregated_vector

例:

v_f_vector

预期产出

enumerate()

代替

iterable = [1,2,3,4]
for i, v in enumerate(iterable):
    print(i,v)

对不起,这不是你问题的真正答案,但是这种方式更具可读性,同样,枚举将始终为您提供索引和值,或者如果它是字典,那么键和值。

值得注意的是,将列表嵌套在字典中然后为每个列表提供一个特定的键以便您可以访问它们。

只是值得深思

为了增加清晰度,假设你有4个向量,向量a,b,x和y。您可以将各自的列表放在各自的字典键中,然后使用键访问它们。

© www.soinside.com 2019 - 2024. All rights reserved.