python-內建資料結構
阿新 • • 發佈:2018-12-15
漢諾塔問題
- 規則:
- 每次移動一個盤子
- 任何時候大盤子在下面,小盤子在上面
- 方法:
- n=1: 直接把A上的一個盤子移動到C上, A->C
- n=2:
- 把小盤子從A放到B上, A->B
- 把大盤子從A放到C上, A->C
- 把小盤子從B放到C上, B->C
- n=3:
- 把A上的兩個盤子,通過C移動到B上去, 呼叫遞迴實現
- 把A上剩下的一個最大盤子移動到C上, A->C
- 把B上兩個盤子,藉助於A,挪到C上去, 呼叫遞迴
- n = n:
- 把A上的n-1個盤子,藉助於C,移動到B上去,呼叫遞迴
- 把A上的最大盤子,也是唯一一個,移動到C上,A->C
- 把B上n-1個盤子,藉助於A,移動到C上, 呼叫遞迴
def hano(n, a, b, c): ''' 漢諾塔的遞迴實現 n:代表幾個盤子 a:代表第一個塔,開始的塔 b:代表第二個塔,中間過渡的塔 c:代表第三個塔, 目標塔 ''' if n == 1: print(a, "-->", c) return None ''' if n == 2: print(a, "-->", b) print(a, "-->", c) print(b, "-->", c) return None ''' # 把n-1個盤子,從a塔藉助於c塔,挪到b塔上去 hano(n-1, a, c, b) print(a, "-->", c) # 把n-1個盤子,從b塔,藉助於a塔,挪到c塔上去 hano(n-1,b, a, c) a = "A" b = "B" c = "C" n = 1 hano(n, a, b, c)
A --> C
n = 2
hano(n, a, b, c)
A --> B A --> C B --> C
n = 3
hano(n, a, b, c)
A --> C A --> B C --> B A --> C B --> A B --> C A --> C
n = 5
hano(n, a, b, c)
A --> C A --> B C --> B A --> C B --> A B --> C A --> C A --> B C --> B C --> A B --> A C --> B A --> C A --> B C --> B A --> C B --> A B --> C A --> C B --> A C --> B C --> A B --> A B --> C A --> C A --> B C --> B A --> C B --> A B --> C A --> C
List(列表)
- del: 刪除命令
# del 刪除
a = [1,2,3,4,5,6]
del a[2]
print(a)
[1, 2, 4, 5, 6]
# del 刪除
# 如果使用del之後,id的值和刪除前不一樣,則說明刪除生成了一個新的list
a = [1,2,3,4,5,6]
print(id(a))
del a[2]
print(id(a))
print(a)
140246810905416 140246810905416 [1, 2, 4, 5, 6]
# del一個變數後不能在繼續使用此變數
del a
print(a)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-14-94bf5611738e> in <module>() 1 del a ----> 2 print(a) NameError: name 'a' is not defined
# 使用加號連結兩個列表
a = [1,2,3,4,5]
b = [5,6,7,8,9]
d = ['a', 'b', 'c']
c = a + b + d
print(c)
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 'a', 'b', 'c']
# 使用乘號操作列表
# 列表直接跟一個整數相乘
# 相當於把n個列表接在一起
a = [1,2,3,4,5]
b = a *3
print(b)
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
# 成員資格運算
# 就是判斷一個元素是否在愛list裡邊
a = [1,2,3,4,5,6]
b = 8
#c 的值是一個布林值
c = b in a
print(c)
b = 4
print(b in a)
False True
# not in
a = [1,2,3,4,5]
b = 9
print(b not in a)
True
連結串列的遍歷
- for
- while
# for in list
a = [1,2,3,4,5]
# 挨個列印a裡邊的元素
for i in a:
print(i)
1 2 3 4 5
# java, c++ 程式設計師寫的python程式碼是這樣的
for i in range(0,len(a)):
print(a[i])
i += 1
b = ["I love wangxiaojing"]
for i in b:
print(i)
I love wangxiaojing
# range
# in 後面的變數要求是可以可迭代的內容
for i in range(1,10):
print(i)
print(type(range(1,10)))
1 2 3 4 5 6 7 8 9 <class 'range'>
# while迴圈訪問list
# 一般不用while遍歷list
a = [1,2,3,4,5,6]
length = len(a)
# indx表示的是list的下標
indx = 0
while indx < length:
print(a[indx])
indx += 1
# 雙層列表迴圈
#a 為巢狀列表,或者叫雙層列表
a = [["one", 1], ["two", 2], ["three", 3] ]
for k,v in a:
print(k, "--", v)
one -- 1 two -- 2 three -- 3
# 雙層列表迴圈變異
#a 為巢狀列表,或者叫雙層列表
a = [["one", 1, "eins"], ["two", 2], ["three", 3,4,5,6,8] ]
for k,v in a:
print(k, "--", v)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-29-a8afd4d727f2> in <module>() 4 a = [["one", 1, "eins"], ["two", 2], ["three", 3,4,5,6,8] ] 5 ----> 6 for k,v in a: 7 print(k, "--", v) ValueError: too many values to unpack (expected 2)
# 雙層列表迴圈變異
#a 為巢狀列表,或者叫雙層列表
a = [["one", 1, "eins"], ["two", 2,"zwei"], ["three", 3,"drei"] ]
#這個例子說明,k,v,w的個數應該跟解包出來的變數個數一致
for k,v,w in a:
print(k, "--", v, "--",w)
one -- 1 -- eins two -- 2 -- zwei three -- 3 -- drei
列表內涵: list content
- 通過簡單方法創作列表
# for 建立 a = ['a', 'b', 'c'] # 用list a建立一個list b # 下面程式碼的含義是,對於所有a中的元素,逐個放入新列表b中 b = [i for i in a] print(b)
['a', 'b', 'c']
# 對a中所有元素乘以10,生成一個新list
a = [1,2,3,4,5]
# 用list a建立一個list b
# 下面程式碼的含義是,對於所有a中的元素,逐個放入新列表b中
b = [i*10 for i in a]
print(b)
[10, 20, 30, 40, 50]
# 還可以過濾原來list中的內容病放入新列表
# 比如原有列表a, 需要把所有a中的偶數生成新的列表b
a = [x for x in range(1,35)] #生成從1到34的一個列表
# 把a中所有偶數生成一個新的列表 b
b = [m for m in a if m % 2 == 0]
print(b)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34]
# 列表生成式可以巢狀
# 由兩個列表a,b
a = [i for i in range(1,4)] # 生成list a
print(a)
b = [i for i in range(100,400) if i % 100 == 0]
print(b)
# 列表生成是可以巢狀,此時等於兩個for迴圈巢狀
c = [ m+n for m in a for n in b]
print(c)
# 上面程式碼跟下面程式碼等價
for m in a:
for n in b:
print(m+n, end=" ")
print()
# 巢狀的列表生城市也可以用條件表示式
c = [ m+n for m in a for n in b if m+n < 250]
print(c)
[1, 2, 3] [100, 200, 300] [101, 201, 301, 102, 202, 302, 103, 203, 303] 101 201 301 102 202 302 103 203 303 [101, 201, 102, 202, 103, 203]
關於列表的常用函式
# len:求列表長度
a = [x for x in range(1,100)]
print(len(a))
# max:求列表中的最大值
# min: 同理
print(max(a))
b = ['man', 'film', 'python']
print(max(b))
99 99 python
# list:將其他格式的資料轉換成list
a = [1,2,3]
print(list(a))
[1, 2, 3]
s = "I love wangxiaojing"
print(list(s))
['I', ' ', 'l', 'o', 'v', 'e', ' ', 'w', 'a', 'n', 'g', 'x', 'i', 'a', 'o', 'j', 'i', 'n', 'g']
# 把range產生的內容轉換成list
print(list(range(12, 19)))
[12, 13, 14, 15, 16, 17, 18]