我是 python 的新手,我必須做一個課堂練習。練習要求我創建一個函式來告訴天氣給定的串列是否按順序遞減(回傳 True 或 False)我嘗試了以下代碼:
def no_decreasing(list):
for num in len(list):
if list[num] <= list[num 1]:
check = bool(1)
else:
check = bool(0)
break
return check
它回傳一個錯誤“int”物件在第 2 行中不可迭代,有誰知道為什么?
uj5u.com熱心網友回復:
注意:不要list用作引數名稱(它是內置型別),請使用其他名稱。我將nums用作串列引數而不是list.
該運算式for num in len(nums)不起作用,因為它len(nums)是一個整數。你想要的是for num in nums(它會遍歷 , 中的每個數字nums,或者for index in len(range(nums))(它會遍歷每個有效索引到nums)。
其他選項:
for i, num in enumerate(nums)--i是索引,num是值。for num1, num2 in zip(nums, nums[1:])--num1并且num2是來自 的兩個連續值nums,通過zippingnums其自身的移位版本獲得。
附加說明:當你需要一個布林值,而不是bool(1)與bool(0)只使用True和False!
您還可以通過按降序對串列進行排序并查看它是否與原始串列相同來簡化整個問題:
def is_decreasing(nums):
return nums == sorted(nums, reverse=True)
uj5u.com熱心網友回復:
那么你正試圖迭代 indeces,所以
for i in range(len(lst)): # never use "list" as a variable name
更確切地說
for i in range(len(lst)-1): # to avoid an index error for its right neighbor
會是合適的。但是,更好的方法是使用zip
def non_decreasing(lst):
for a, b in zip(lst, lst[1:]):
if b < a:
return False
return True
該模式的簡寫是anyor all:
def non_decreasing(lst):
return all(a <= b for a, b in zip(lst, lst[1:]))
# return not any(b < a for a, b in zip(lst, lst[1:]))
uj5u.com熱心網友回復:
您正在嘗試獲取for回圈中的索引,但您犯了語意錯誤:
for num in len(list):
# This does not work. It can not iterate through an integer.
len()函式回傳一個整數。你基本上是說for num in 10,如果串列有 10 個數字。
你想要的是range函式:
for num in range(0, len(list)):
這將從num=0到回圈num=0 len(list)-1。
但是要小心if list[num] <= list[num 1]:,因為以前的方法會使該行搜索的索引大于您的陣列大小。因此,這是您修復代碼的方法:
for num in range(0, len(list)-1):
PS:還有其他方法可以解決該問題,但由于這是課堂練習,因此我專注于解決您在迭代整數時遇到的問題。
uj5u.com熱心網友回復:
其他人指出使用zip(lst, lst[1:]). 但是,這對于大型串列是不可取的,因為您首先必須復制lst(減去第一個元素)zip才能生成for回圈使用的成對迭代器。
相反,使用兩個單獨的迭代器,在將其傳遞給 之前推進第二個迭代器zip。
def no_decreasing(lst):
i1 = iter(lst)
i2 = iter(lst)
next(i2)
return all(a >= b for a, b in zip(i1, i2))
# Or you can use map
# return all(map(operator.ge, i1, i2))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314348.html
