range() 中的计数器未被识别为整数

我正在尝试使用嵌套的 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.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 可能是意外类型 (int, str),这表示 c 没有充分定义为整数。我犹豫要不要向 PyCharm 提出问题,因为我可能遗漏了一些简单的东西。有人看到我缺少什么吗?


慕田峪9158850
浏览 172回答 3
3回答

江户川乱折腾

关于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']]注意:您的代码也可以进行调整,但我建议使用推荐的变体。

慕标5832272

我认为警告来自您用字符串替换整数值的事实。当我尝试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_vectoraggregated_vector = [[0, 8, 0, 6], [0, 1, 0, 0, 0, 0, 9, 0], [0, 0, 10, 0], [0, 10, 0, 0, 0]]class_count = 10vote_fraction = get_vote_fraction(class_count, aggregated_vector)print(vote_fraction)它将允许您在aggregated_vector不将这些更改反映到实例化的情况下进行更改v_f_vector。

红颜莎娜

你应该使用 enumerate()例子:iterable = [1,2,3,4]for i, v in enumerate(iterable):    print(i,v)预期输出0 11 22 33 4代替for x in range(0, len(iterable)):    print(x, iterable[x])抱歉,这并不是您问题的真正答案,但这样更易于阅读,而且,枚举将始终为您提供索引和值,或者如果它是字典,则是键和值。可能还值得注意的是,将列表嵌套在字典中,然后为每个列表提供一个特定的键,以便您可以访问它们,这使人类可读性更高。只是深思熟虑为了更清晰,假设您有 4 个向量,向量 a、b、x 和 y。您可以将它们各自的列表放在自己的字典键中,然后使用它们的键访问它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python