メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年3月1日土曜日

[Python][お勉強] 「Pythonチュートリアル」を読む(9) -- データ構造

リストの補足。

  • append(x)
  • extend(L)
  • insert(i,x)
  • remove(x)
  • pop(i),pop()
  • index(x)
  • count(x)
  • sort()
  • reverse()
の説明が書かれている。

関数プログラミングのツール

filter()
書式は以下のとおり。

filter(関数, シーケンス)
 

シーケンスから、関数が真となるアイテムのみを取り出し、取り出したアイテムから成る
シーケンスを返す。


>>> L = [1,2,3,4,5]
>>> filter(lambda x: x % 2, L)
[1, 3, 5]
>>>
 

な感じ。


map()
書式は以下のとおり。

map(関数, シーケンス)
 


シーケンスの各要素をパラメータに関数を実行し、その関数の実行結果からなるシーケンスを
返す。
シーケンスは複数個渡すこともできて、その場合関数はシーケンスの個数分の要素を受け取れる
ようにする必要がある。

>>> map(lambda x: x**2, L)
[1, 4, 9, 16, 25]
>>> map(lambda x, y: x**2 + y ** 2,L,L)
[2, 8, 18, 32, 50]
 

な感じ。

mapに渡すシーケンスが複数の場合で、「長さ」が異なるシーケンスが渡された場合、
不足した要素の分はNoneが使用される。

>>> L2 = [1,2]
>>> map(lambda x, y: (x, y), L, L2)
[(1, 1), (2, 2), (3, None), (4, None), (5, None)]
>>>
 



reduce()
書式は以下のとおり。

reduce(関数, シーケンス)
 

シーケンスの最初の2つの要素をとり、関数に渡す。その結果と次のシーケンスの要素を1つ取り、
関数に渡す。この処理をシーケンスの要素がなくなるまで繰り返す。
以下、1から10の総和。

>>> reduce(lambda x, y: x + y, range(1,11))
55
>>>


また、第三引数に初期値を指定できる。
初期値は最初の要素としてreduceに渡される。

>>> reduce(lambda x, y: x + y, range(1,11), 100)
155
>>>
 



リスト内包表記
書式は以下のとおり。

[式 for節 if節]
 

式とそれに続くfor節から成る。
さらに0個以上のforまたはif節が続けられる。

得られる結果は、式をforまたはif節で評価した結果のリスト。
式の評価値がタプルになる場合は括弧で囲まなければならない。


>>> [ x ** 2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> [ (x ** 2, x ** 3) for x in range(1,11)]
[(1, 1), (4, 8), (9, 27), (16, 64), (25, 125), (36, 216), (49, 343), (64, 512), (81, 729), (100, 1000)]
>>>
 



del文
リストの要素を削除する。

>>> del L[1]
>>> L
[1, 3, 4, 5]
>>> del L[1:3]
>>> L
[1, 5]
>>>
 

な感じ。


タプルパッキング

>>> t = 1,2,3
>>> t
(1, 2, 3)
>>>
 



タプルアンパッキング

>>> t
(1, 2, 3)
>>> (a,b,c) = t
>>> a
1
>>> b
2
>>> c
3
>>>
 

な感じ。

多重代入は、タプルパッキングとタプルアンパッキングのあわせ技。

集合
重複しない要素を順不同で集めたもの。

>>> L = [1,2,3,1,2,3]
>>> set(L)
set([1, 2, 3])
>>>
 

な感じ。
数学的演算もサポートする。


>>> s1 = set('abcdefg')
>>> s2 = set('cdefghi')
>>> s1 - s2
set(['a', 'b'])
>>> s1 | s2
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h'])
>>> s1 & s2
set(['c', 'e', 'd', 'g', 'f'])
>>> s1 ^ s2
set(['i', 'h', 'b', 'a'])
>>>
 




ディクショナリ
いわゆる、連想配列やハッシュ。
キーには可変型オブジェクトは使えない。


ディクショナリのループ

>>> for k, v in D.iteritems():
... print "%s=%d" % (k, v)
...
a=1
c=3
b=2
>>>
 

iteritems()なんてのも使える。


シーケンスからインデックス値も同時に得る
enumerateを使うと、インデックス値をも得ることができる。

>>> L = [1,2,3,4,5]
>>> for i, v in enumerate(L):
... print "%d=%d" % (i,v)
...
0=1
1=2
2=3
3=4
4=5
>>>
 




おしまい。
.

0 コメント: