簡體   English   中英

索引錯誤:列表超出范圍(Python)排序問題+枚舉()

[英]Index Error: list out of range (Python) Sorting Problem + Enumerate ()

對於我的一門課,我們正在進行調試活動。 因此,為此,我們應該通過定位最小值並在 position i 和 index_of_min_item 處交換元素來對列表進行排序。

枚舉 function 作為模板的一部分給出,所以我必須將它包含在代碼中。 但是如果有人可以解釋並幫助我,我不確定我應該如何使用它。

我寫了一個測試用例,但是當我嘗試運行它時,我不斷收到錯誤消息“IndexError:list index out of range”。 我已經檢查了很多次,但無法弄清楚代碼有什么問題。 有人可以幫我找出問題嗎?

import sys
from typing import Iterable, List, TypeVar, Any

T = TypeVar('T')


def swap(values: List, index1: int, index2: int) -> None:
    a = index1
    b = index2
    temp = values[a]
    values[a] = values[b]
    values[b] = temp
    # return values


def get_index_of_min_item(items: List[T]) -> int:
    index_of_min_item = 0
    min_item = items[index_of_min_item]
    for index in range(len(items)):
        cur_item = items[index]
        if cur_item < min_item:
            index_of_min_item = index
            min_item = cur_item
    return index_of_min_item


def sort_items(items: Iterable[T]) -> List[T]:
    n_items=[]
    for pos, items in enumerate(items):
        n_items.append(items)
    for i in n_items:
        index_of_min_item = get_index_of_min_item(n_items[i:-1])
        swap(n_items, n_items[i], n_items[index_of_min_item])
        return n_items

sort_items function 的調試器:

import unittest
from typing import TypeVar
from src import sorting

T = TypeVar('T')


class TestSorting(unittest.TestCase):
    def test_sortNum(self):
        self.assertEqual(sorting.sort_items([13, 18, 6, 5, 0]),[0,5,6,13,18])

if __name__ == '__main__':
    unittest.main()

錯誤消息:文件“/Users/Downloads/Sorting/src/sorting.py”,第 30 行,在 get_index_of_min_item min_item = items[index_of_min_item] IndexError: list index out of range

歡迎來到 SO,@vsc。

我有一點空閑時間來檢查您的代碼並為您優化它。

  • 首先,您的錯誤原因是:

    for i in n_items:當 n_items = [13, 18, 6, 5, 0]時,列表索引范圍是 [0-4]

    從第一個項目值i=13 => n_items[i:-1] (13 > 4) => IndexError: list index out of range

  • 好的,讓我們來看第一個建議: for i in range(len(n_items)) ,這個 for 循環檢查i => [0-4]

    i=0 => index_of_min_item=3 (錯誤,正確的是 4)=> swap(n_items, n_items[i], n_items[index_of_min_item])將變為swap(n_items, 13, 5) => temp = values[a=index1] => n_items[13] => IndexError: 列表索引超出范圍

無論您的代碼在這里有太多問題:D

Python 還支持一些更快的方法來處理這些事情,例如:

  • 交換: a,b = b,aitems[a], items[b] = items[b], items[a]

  • get_index_min_value: items.index(min(items[i:]))

盡力更正您的代碼,這就是我的全部幫助。

這是您的作業,在 python 3+ (items: List[T]) -> int有點沒用,刪除它也沒什么區別。

import unittest

def swap(values, index1, index2):
    values_tmp = values[index1]
    values[index1] = values[index2]
    values[index2] = values_tmp

def get_index_of_min_item(items):
    # > len() returns the number of items on a list
    # > range() by deafults uses 0 to start and the end
    # > for a loop shuld be (nº items - 1)

    # > Use of range >
    # >   range(end_index)
    # >   range(start_index, end_index)

    cur_item = items[0]
    out_index = 0
    for index in range(1, len(items)):
        if items[index] < cur_item:
            cur_item = items[index]
            out_index = index
    return out_index

def sort_items(items, descendent=False):
    # n_items = []
    # for pos, item in enumerate(items):
    #     n_items.append(item)
    # > equivelant to :
    n_items = items

    # for i in n_items:
    # > in this case i is not the correct variable,
    # > it is a int() but is conent of the list and
    # > not the index of the content

    last_index = len(n_items) - 1
    for i in range(last_index):
        # > [i:-1] means for x index up to the previus last
        # > [ start_index : end_index ] (end_index is not included)
        lowest_of_reamining = get_index_of_min_item(n_items[i:])
        # > each time get_index_of_min_item() is getting smaller and
        # > smaller list, an offset is needed
        lowest_of_reamining += i

        # swap(n_items, n_items[i], n_items[index_of_min_item])
        # > if swap() ask for a index give a index
        # > not the content of the index
        swap(n_items, i, lowest_of_reamining)

    return n_items

class TestSorting(unittest.TestCase):
    def test_sortNum(self):
        self.assertEqual(
            sort_items(
               [13, 18, 6, 5, 0]
            ), [0, 5, 6, 13, 18]
        )

if __name__ == '__main__':
    unittest.main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM