3 回答

TA貢獻1820條經驗 獲得超9個贊
只是為了好玩,我想嘗試使用zip、列表理解和切片表示法。就我個人而言,這更符合邏輯——但也許這只是我不平衡的大腦。
它看起來像這樣一團糟:
def folded(lst) -> list:
"""Fold a list by summing opposite ends."""
r = [a+b for a, b in zip(lst, lst[::-1])][:(len(lst)//2)+1]
if len(lst) % 2 != 0:
r = r[:-1] + [r[-1:][0]//2]
else:
r = r[:-1]
return r
輸出:
l = [2]
>>> [2]
l = [2, 5]
>>> [7]
l = [2, 5, 8]
>>> [10, 5]
l = [2, 5, 8, 10]
>>> [12, 13]
l = [2, 5, 8, 10, 12]
>>> [14, 15, 8]

TA貢獻1802條經驗 獲得超4個贊
您有一個代碼片段,也許可以實現您想要的功能
您可能只向您的教授發送了列表理解。他們希望你發送一個函數。
(使用奇特的“列表理解”,這就是所謂的方括號結構,而不是 for 循環),
非常不言自明
您只需將它放在函數定義中并測試它是否有效。列表理解的使用并不是它不是函數的原因,而是因為
def function_name(arguments):
看不到任何線條。
def function_name(argument1, argument2, ...):
是什么使該塊內的代碼成為一個函數。如果您提交此信息:
def folded_list(input_list): a = input_list folded_list_output = [ a[i] + a[-(i + 1) ] for i in range( len(a) // 2)] return folded_list_output
thenfolded_list
是采用單個參數的函數input_list
。
由于您有一些 FORTRAN 背景,FORTRAN 中的子例程或函數將被歸類為 Python 中的函數。還記得在 FORTRAN 中如何function myfunc(arg1, arg2, arg3) result(answer)
定義函數嗎?你需要def myfunc(arg1, arg2, arg3)
用Python說。在 FORTRAN 中,函數必須返回某些內容,但子例程不能。在 Python 中,函數可能返回某些內容,也可能不返回某些內容。這幾乎是新手級別的唯一區別。
測試“極端情況”總是一個好主意
極端情況是您期望會破壞代碼的情況(但理想情況下不會)。測試極端情況可以確保您的代碼穩健,并且在收到時髦但有效的輸入時不會中斷。
例如,當您提供空列表作為輸入時,它會執行您想要的操作嗎?
可以?
folded_list([]) # Output: []
當然看起來像它
對于具有奇數個元素的列表會發生什么?(提示:它沒有做它應該做的事情,因為中間的元素完全被刪除了。)
folded_list([1, 2, 3, 4, 5]) # Output: [6, 6]
嘿!這看起來不對勁!3
列表中間的發生了什么?
現在,由于本練習的全部目的是讓您學習,因此我不會向您提供所需的代碼。不過,您可以使用以下算法:
對于包含奇數個元素的列表,假設為 5,
len(list) = 5
所以
len(list) // 2 = 2
索引0和1需要添加到3和4上
索引 2 需要單獨保留(嘿,看,
2 = len(list) // 2
)迭代列表的前半部分
如果當前索引小于
len(list)//2
,則追加list[index] + list[-index]
到新列表(負索引只是告訴 Python 向后計數而不是向前計數該元素,因此list[-2]
將為您提供倒數第二個元素)如果索引等于
len(list)//2
,則追加list[index]
len(list)
當偶數時這有效嗎?如果它不適用于偶數大小的列表,您能想出一種適用于偶數和奇數大小的列表的算法嗎?if
或者是有條件檢查列表大小,然后針對偶數大小運行一種算法,針對奇數大小運行另一種算法的唯一選擇?這對你來說是一個練習!
另請注意:當我還是初學者時,我發現首先寫出整個循環,然后如果可能的話將其壓縮為列表理解更為直觀。這個列表的理解:
folded_list_output = [ a[i] + a[-(i + 1) ] for i in range( len(a) // 2)]
如果這樣寫,就更容易理解(或者至少對我來說是很多年前):
folded_list_output = []
for i in range(len(a) // 2):
elem1 = a[i]
elem2 = a[-(i + 1)]
folded_list_output.append(elem1 + elem2)

TA貢獻1833條經驗 獲得超4個贊
您可以從 start(假設i)開始迭代到中間并添加i兩側的 th 元素,然后返回新列表:
a = [10, 14, 21, 25, 52, 55]
b = [10, 14, 21, 25, 52, 55, 1]
def folded_list(input_list):
new_list = []
l = len(input_list)
for i in range(l//2):
new_list.append(input_list[i] + input_list[-i-1])
if l % 2 != 0:
return new_list + [input_list[l//2]]
return new_list
print(folded_list(a)) # [65, 66, 46]
print(folded_list(b)) # [11, 69, 73, 25]
添加回答
舉報