百家號不支持代碼格式,文章裡的代碼排版都是亂的。
如果需要拷貝代碼,可以去同名的微信公眾號。
接上篇的題目。
給定如下圖的列表l1。
0表示空土坑,1表示有樹苗的土坑。
要求樹苗不能相鄰,還可以種植多少棵新樹苗。
顯然可以從列表的第1個位置開始循環。
如果這個位置前後都沒有樹苗,那麼這個位置滿足條件。
不過需要注意2點:
有2個特殊位置,第1個位置和最後1個位置,並不需要前後都為0。一種做法是,用if語句判斷位置,對這2個位置特殊處理。一種更巧妙的辦法是,用上一篇學過的知識,在列表 l1 頭尾補上一個0。這樣,在新列表中,只看第2個元素到倒數第2個元素,所有元素的判斷邏輯是一致的。 l2 = [0] + l1 + [0]
滿足條件的位置種上樹苗後,會影響後面的位置。比如下面的列表,位置3先滿足條件,位置4就不再滿足條件了。所以,當一個位置不滿足條件時,繼續判斷下一個位置,但是當一個位置滿足條件時,它的下一個位置肯定不滿足條件,要跳過。
完整的程序
import numpy
n = 20
l1 = numpy.random.randint(0,2,n).tolist()
for i in range(1,n):
if l1[i-1] == 1 and l1[i] == 1:
l1[i] = 0
l2 = [0] + l1 + [0]
count = 0
k = 1
while k < len(l2)-1:
if l2[k-1] == 0 and l2[k] == 0 and l2[k+1] == 0 :
count = count + 1
k = k + 2
else:
k = k + 1
備註:程序的前面用numpy模塊生成了一個只包含[0,1]的隨機列表,並用for循環清除了連續的1。
Python處理列表的內置函數
Python提供了一些內置函數,可以處理列表類的實例。
先介紹3個: len(),max(),min()
列表類的常用函數
列表類本身也有豐富的函數。
為了便於記憶,我們對這些函數進行了歸類整理。
前面說過,列表類就像是哆啦a夢的魔法口袋,本質上是一個容器,對於一個裝東西的容器,最常用的四大類操作是「增、刪、改、查」
新增:向列表裡增加元素
向列表裡新增元素有3個函數。分別是
append(obj):在列表末尾增加1個元素。如 old.append(8)
extend(seq):在列表末尾增加多個元素。如old.append([4,5]) 。
insert(index, obj):在列表指定的任意位置增加1個元素。如old.insert(2,6)。
示例:
刪除:從列表裡刪除元素
從列表裡刪除元素也有3個函數。分別是
pop(index):在列表任意位置刪除1個元素。
如果不指定位置,則刪除末尾的元素,如 old.pop()
如果指定位置,則刪除指定位置的元素,如 old.pop(2)
remove(obj):在列表刪除第一個值相同的元素。如old.remove(9)
clear():刪除列表所有元素。如old.clear()
注意:pop()函數是刪除列表裡某個位置上的元素,而remove()函數是刪除第一個值相等的元素,如列表 old = [1,2,9,3,7,9], old.remove(9),刪除的是列表裡的第一個9,列表變成 [1,2,3,7,9]
示例:
特別要理解新增、刪除操作後,列表裡元素位置的變化。以old.remove(3)為例,3這個元素被刪除後,後面的元素都往前排了。
修改:修改列表裡的元素
如果修改列表裡元素的值,用賦值運算符。
如 old = [1,2,9,3,7,9],要把第2個元素修改為6,old[1] = 6
如下的2個函數並不修改元素的值,而是修改元素的位置。
reverse():把列表裡的元素反轉。
sort():把列表裡的元素排序。
默認是升序,如 old.sort()
可以通過參數reverse=True,變成降序,如 old.sort(reverse=True)。
示例:
查找:在列表裡查找匹配的元素
count(obj):在列表裡查找匹配元素的個數。如old.count(9)。
index(obj):在列表表裡查找第一個匹配元素的位置。old.index(2)。
注意:
新增、刪除、修改類函數都是修改列表本身。而查找類的函數是返回一個結果。如果查找的元素在列表裡不存在,count()函數返回的結果是0,但index()函數會出錯。所以在使用index()函數之前,要先判斷列表裡是否有這個元素。
判斷列表裡是否有某個元素,除了用count()函數,還可以用 in 。
只能活1個
歷史上,猶太人曾經被羅馬人屠殺。
為躲避羅馬人的追殺,著名猶太歷史學家 約瑟夫(Josephus)和另外19個猶太人躲進了山洞。
困在山洞的他們缺衣少食,快被餓死了,於是商量著有尊嚴地自殺。
他們圍坐成一圈,從1開始報數,報到3的人先自殺,然後下一個人繼續從1開始報數,報到3的人再自殺……
如下圖
坐在3號位置的第1個自殺
6號位置的第2個自殺
……
如果Josephus想活下來,他要坐在什麼位置?