[英]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,a
或items[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.