mylist = list('94871234')
mylist
['9', '4', '8', '7', '1', '2', '3', '4']
就把 int
用到整個 list。
map(int, mylist)
<map at 0x7fbc58531908>
但這樣是抽象的 map
, 想具體看到是用 list
換成具體的 list。
list(map(int, mylist))
[9, 4, 8, 7, 1, 2, 3, 4]
mylist = [9, 4, 8, 7, 3, 5, 10]
我們要先訂一個平方函式。
def square(x):
return x**2
squared = map(square, mylist)
用 list 看一下。
list(squared)
[81, 16, 64, 49, 9, 25, 100]
但這也太麻煩了!
這種臨時要用的, 可以用 lambda
來定義這個函數。語法是:
lambda 輸入:輸出
比方說剛剛的平方動作...
list(map(lambda x:x**2, mylist))
[81, 16, 64, 49, 9, 25, 100]
Python 有個很炫的快速 list 產成方式, 叫 list comprehension。
簡單的說, 很像我們數學集合表示法。比方說, 有個集合是:
$$\{ 2k+1 \mid k \in \{0, 1, 2, 3, 4, 5\} \}$$就是前 6 個奇數:
$$\{1, 3, 5, 7, 9, 11 \}$$在 Python 可以這麼做...
[2*k+1 for k in range(5)]
[1, 3, 5, 7, 9]
是不是超級酷!
我們也可做相當複雜的事情。比如說現在我們想把一個字串:
st = 'abxCDefGHLmk'
轉成
binary_str = '000110011100'
也就是小寫就記為 0, 大寫記為 1。
st = 'abxCDefGHLmk'
[x.isupper() for x in st]
[False, False, False, True, True, False, False, True, True, True, False, False]
有... 一點... 酷, 那就是... 出現一個 list, 小寫是 Flase, 大寫是 True...
我們是要 0 和 1...
但我們看一下兩個判斷式。
True == 1
True
False == 0
True
這其實就是 0, 1 耶, 這時只要把這 True, False 用 int
轉換就可以!
[int(x.isupper()) for x in st]
[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0]
是不是很炫? 但我們要的是字串, 不要緊、再來...
[str(int(x.isupper())) for x in st]
['0', '0', '0', '1', '1', '0', '0', '1', '1', '1', '0', '0']
把這個 list 再合成字串可以嗎? 可以哦, 用 join
...
''.join([str(int(x.isupper())) for x in st])
'000110011100'
是不是很炫?
不過說實在這不太易讀, 我們也不一定非要這樣耍寶。只是說 Python 可以這麼做。
L = ['python', 'matplotlib', 'pandas', 'scikit-learn']
for i in L:
print(i)
python matplotlib pandas scikit-learn
有時, 我們需要知道它的 index
, 也就是第幾個元素。
for i in range(len(L)):
print(i, L[i])
0 python 1 matplotlib 2 pandas 3 scikit-learn
但這好像麻煩了點。可以有更簡單的方式嗎? 有的, 就是用 enumerate
。
for x in enumerate(L):
print(x)
(0, 'python') (1, 'matplotlib') (2, 'pandas') (3, 'scikit-learn')
我們其實用了好幾次, 但沒認真說的是, Python 很容易從一個 tuple (或 list) 取出元素。
x = (8, 7)
a, b = x
a
8
b
7
所以, 用在 enumerate
上就會是...
for i, x in enumerate(L):
print(i, x)
0 python 1 matplotlib 2 pandas 3 scikit-learn
更炫的是, 從 1 (或任何數字) 開始都可以!
for i, x in enumerate(L, 1):
print(i, x)
1 python 2 matplotlib 3 pandas 4 scikit-learn
先想好自己的策略, 分析需要什麼東西, 再想辦法寫成程式。
例如, 我們想確認某字串最長的 $k$-交錯子字串是多長。
st = 'abxCDefGHLmk'
轉成
binary_str = '000110011100'
也就是小寫就記為 0, 大寫記為 1。
假設我們要看的是 2-交錯字串。 (k=2)
我們至少要看到其中一種模式:
p0 = "00"
p1 = "11"
也就是
p0 in binary_str
p1 in binary_str
至少一個成立, 那就進到第 2 回合, 否則就停止。
我們至少要看到其中一種模式:
p0 = "0011"
p1 = "1100"
也就是
p0 in binary_str
p1 in binary_str
至少一個成立, 那就進到第 3 回合, 否則就停止。
我們至少要看到其中一種模式:
p0 = "001100"
p1 = "110011"
也就是
p0 in binary_str
p1 in binary_str
至少一個成立, 那就進到第 3 回合, 否則就停止。
我們要看最後第幾回合是成功的 (假設是 round 回), 那最後答案就是:
round*k