lispとrubyとpythonと その3 リスト処理(python)

次はpython
これもだいぶ前に書いたから忘れたよ・・・。
もったいない・・・。

# -*- coding:utf-8 -*-
#関数
#可変長引数
def fun1(*arg):
    print arg

def fun2(**arg):
    print arg

#*だと引数としてタプルがくる
fun1(1,2,3,4)

#**だとDictonaryがくる
fun2(a=1,b=2,c=3)

#文字列追記
#エスケープシーケンスが無効になる
print r"~\xxx\xxx"

#シングルクオート、ダブルクオートを三つ重ねて書くと改行もかける
print """改行を
含んだ
文字列"""

#単に文字列を並べると+で連結される

temp = "あいう" "えお" "かきくけこ"
print temp

#ユニコード文字列
print u"にほんご日本語ニホンゴ"

#pythonでは
#シーケンス+→文字列
#          +→ユニコード文字列
#          +→リスト
#          +→タプル
#          +→バッファ
#          +→xrange オブジェクト

#バッファ型ってなんだ??
#・・・buffer() で生成することができるらしい
#http://www.python.jp/doc/release/lib/non-essential-built-in-funcs.html
#ここにbuffer関数の説明はあるが・・・読んでもわかんね。
#わかんないから忘れとく

#文字列
s = "あいうえお"

#ユニコード文字列
us = u"かきくけこ"

#リスト
lst = [1,2,3,4,5]

#タプル
tpl = (6,7,8,9,10)

#xrange
#rangeだとリストが返る
print range(0,3)

#xrangeだとxrangeオブジェクト(ジェネレータ)が返る。たぶんリストを作らないからメモリ消費量が少ないんだと思う
xrng = xrange(0,5)

#シーケンスの操作関数
#長さ
#文字列
print len(s)

#ユニコード文字列
print len(us)

#リスト
print len(lst)

#タプル
print len(tpl)

#xrange
print len(xrng)

#print len(s)こっちは15で
#print len(us)こっちが5になる
#len(文字列)だとバイト数が返るらしい
#len(ユニコード文字列)だと文字数が返る
#http://www.python.jp/Zope/articles/japanese/Python4Japanese-2

#連結
print s + "わをん"

#ユニコード文字列
print us + u"わをん"

#リスト
print lst + [6,7,8,9]

#タプル
print tpl + (11,12,13,14)

#xrangeこれはダメ。まぁそうだろな
#print xrng + xrange(4,5)

#繰り返し
print s * 3

#ユニコード文字列
print us * 3

#リスト
print lst * 3

#タプル
print tpl * 3

#xrangeこれもダメ。
#print xrng * 3

#ループはfor ... inで
#文字列
for e in s:
    print e

#ユニコード文字列
for e in us:
    print e

#リスト
for e in lst:
    print e

#タプル
for e in tpl:
    print e

#xrange
for e in xrng:
    print e

#シーケンスに含まれているかのテスト
#文字列
print "う" in s

#ユニコード文字列
print u"く" in us

#リスト
print 3 in lst

#タプル
print 7 in tpl

#xrange
print 3 in xrng

#インデックスで取り出し
#文字列
print s[3]

#ユニコード文字列
print us[3]

#リスト
print lst[3]

#タプル
print tpl[3]

#xrange
print xrng[3]

#マイナスだと後ろから数える
#文字列
print s[-2]

#ユニコード文字列
print us[-2]

#リスト
print lst[-2]

#タプル
print tpl[-2]

#xrange
print xrng[-2]

#スライシング、一部取り出し
print s[1:3]
print s[1:]
print s[:-1]

#ユニコード文字列
print us[1:3]
print us[1:]
print us[:-1]

#リスト
print lst[1:3]
print lst[1:]
print lst[:-1]

#タプル
print tpl[1:3]
print tpl[1:]
print tpl[:-1]

#xrangeなんかだめっぽい
# print xrng[1:3]
# print xrng[1:]
# print xrng[:-1]

#変更
#文字列 immutableだからダメ
# s[3] = "ん"
# print s
#リストにして書き換えてから文字列に戻す手が使える
l = list(s)
l[3] = "ん"
s = "".join(l)
print s

#ユニコード文字列 immutableだからダメ
# us[3] = u"ん"
# print us
#リストにして書き換えてから文字列に戻す手が使える
l = list(us)
l[3] = u"ん"
us = "".join(l)
print us
#一行で書きたい・・・がダメ。pythonの代入が値を返さないせい??
#つうか代入が値を返さないのは致命的・・・。
#print "".join(list(us)[3]=u"ん")

#リスト
lst[3] = 100
print lst

#タプル immutableだからダメ
# tpl[3] = 100
# print tpl

#xrange immutableだからダメ
# xrng[3] = 100
# print xrng

#文字列関数とstringのメソッド
#基本的にはメソッドをよびなさい、とのこと
#stringのメソッド
#http://www.python.jp/doc/release/lib/string-methods.html#string-methods

#文字列関数
#http://www.python.jp/doc/release/lib/node107.html

#リスト
#http://www.python.jp/doc/release/tut/node7.html

#リストに追加
lst = [1,2,3,4,5]
lst.append(6)
print lst

#いちいち戻り値がvoidになっているのが・・・いやだ・・・
#拡張
lst = [1,2,3,4,5]
lst.extend([6,7,8])
print lst

#ソート
lst = [3,1,5,4,2]
lst.sort()
print lst

#検索
lst = [1,2,3,4,5]
print lst.index(3)

#反転
lst = [1,2,3,4,5]
lst.reverse()
print lst

#リストの要素削除
lst = [1,2,3,4,5]
del lst[2]
print lst

lst = [1,2,3,4,5]
del lst[2:4]
print lst

lst = [1,2,3,4,5]
print lst.pop()

lst = [1,2,3,4,5]

#タプル
#これだと式なのか判断できないからダメ
#tpl = (1)
#後ろに,をつけないとダメ
tpl = (1,)
print tpl

#型の混在OK
tpl = (1,"a",2.00)
print tpl

#まあリストもだけど
lst = [1,"a",2.00]
print lst

#immutableなので書き換えはダメ
#tpl[1] = "b"
#print tpl

#ソートするならいったんリストにする
tpl = (3,2,1)
tmp = list(tpl)
tmp.sort()
print tmp
tpl = tuple(tmp)
print tpl

#こんなふうにはかけない
#sortの戻りがvoid
# tpl = (3,2,1)
# print tuple(list(tpl).sort())

#set
#集合。重複がなく、順序づけされない
lst = [1,2,3,4]
tpl = (2,3,4)

#set(...)で集合を作る
st1 = set(lst)
st2 = set(tpl)

#frozenset
#http://www.python.jp/doc/release/lib/built-in-funcs.html
fset = frozenset([1,2,3])

#長さをはかる
print len(st1)

#メンバに含まれているかテスト
print 1 in st1

#メンバに含まれていないかテスト
print 1 not in st1

#st1にst2の全ての要素が全て含まれるかテスト
print st2.issubset(st1)
print st2 <= st1

#st2にst1の全ての要素が全て含まれるかテスト
print st2.issuperset(st1)
print st2 >= st1

#union
st1 = set([1,2,3])
st2 = set([2,3,4])
print st1.union(st2)
print st1|st2

#積集合
st1 = set([1,2,3])
st2 = set([2,3,4])
print st1.intersection(st2)
print st1 & st2

#差集合
st1 = set([1,2,3])
st2 = set([2,3,4])
print st1.difference(st2)
print st1 - st2

#両者に共通しない要素を抜き出す
st1 = set([1,2,3])
st2 = set([2,3,4])
print st1.symmetric_difference(st2)
print st1 ^ st2

#setのShallowCopy
tmp = st1.copy()
print tmp

#mapというかDictionary
mp = {"a":0,"b":1,"c":2}
print mp

#長さ
print len(mp)

#要素の取り出し
print mp["a"]

#設定
mp["a"] = 999
print mp["a"]

#削除
mp = {"a":0,"b":1,"c":2}
del mp["a"]
print mp

#その他はこのへん
#http://www.python.jp/doc/release/lib/typesmapping.html

#ビルトイン関数
#all
lst = [2,4,6]
print all( e % 2 == 0 for e in lst)

#any
lst = [1,2,3,4,5]
print any( e % 2 == 0 for e in lst)

#enumerate
#値とインデックス(というかカウント)を同時に利用しながら回す
lst = ["aaa","bbb","ccc","ddd"]
for i,x in enumerate(lst):
    print str(i) + ":" + x

#filter
for x in filter(lambda e:e % 2 ==0,[1,2,3,4,5]):
    print x

import sys

#map
#printは文だからlambdaにかけないけどsys.stdout.writeならOK
#それも微妙だが。。。
map(lambda e:sys.stdout.write(e + "\n"),["aaa","bbb","ccc"])

#max
print max([1,2,3,4,5])
print min([1,2,3,4,5])

#reduce
#今のところある。3.0でなくなる??
print reduce(lambda a,e:a + [e * 2],[1,2,3,4],[])

#sorted
print sorted([3,2,4,1,5])

#sum
print sum([1,2,3,4,5])

#tuple
print tuple([1,2,3,4,5])

#zip
print zip([1,2,3],["a","b","c"],[2.0,3.0,4.0])

#Itertool関数
#http://www.python.jp/doc/release/lib/itertools-functions.html

#chain
#全てのリストをたぐってはくれないのか・・・
import itertools
for x in itertools.chain([1,[2,[3,4]):
    print x

#count
for x in itertools.count():
    print x
    if x > 5:
        break

#cycle
i = 0
for x in itertools.cycle([1,2,3]):
    print str(i) + ":" + str(x)
    if i > 10:
        break
    i=i+1

#dorpwhile
for x in itertools.dropwhile(lambda a: a < 2,[1,2,3,4]):
    print x

#groupby
#なんだか微妙??
tbl = [("taro","python"),
       ("taro","ruby"),
       ("jiro","commonlisp"),
       ("jiro","pyhon"),
       ("jiro","sheme"),
       ("hanako","c"),
       ("hanako","ruby"),
       ("youko","python"),
       ("youko","commonlisp")]

for k,g in itertools.groupby(tbl,lambda tpl:tpl[0]):
    #gメソッド一覧を表示
    dir(g)
    print k
    for l in g:
        print "\t" + l[1]

#ifilter
for x in itertools.ifilter(lambda a: a % 2 == 0,[1,2,3,4,5]):
    print x

#ifilterfalse
for x in itertools.ifilterfalse(lambda a: a % 2 == 0,[1,2,3,4,5]):
    print x

#imap
def p(s,i):
    print "lambda print:" + s + ":" + str(i)
    return "@" + s

for x in itertools.imap(p,["a","b","c","d"],xrange(0,100)):
    print x

#islice
s = """名前:山田太郎
年齢:19
性別:男
名前:井上俊介
年齢:19
性別:男
名前:柳沢克典
年齢:19
性別:男
名前:小田裕子
年齢:19
性別:女"""

for x in itertools.islice(s.splitlines(),0,None,3):
    print x

#izip
for x in itertools.izip([1,2,3],["a","b","c"],xrange(100)):
    print x

#repeat
for x in itertools.izip([1,2,3],["a","b","c"],itertools.repeat("a")):
    print x

#starmap imapのstart版
def sp(*arg):
    print arg
    return arg

for x in itertools.starmap(sp,itertools.izip([1,2,3],["a","b","c"])):
    print x

#takewhile
for x in itertools.takewhile(lambda a: a < 3,[1,2,3,4,5]):
    print x

#tee
#これどうつかうんだ??
for x in itertools.tee([1,2,3,4]):
    for y in x:
        print y

#リスト内包表記
lst = [x * 2 for x in xrange(0,5)]
print lst

lst = [(a,b,c) for a in xrange(0,5)
       for b in ["a","b","c"]
       for c in [4,5,6,7,8,9] if 5 < c < 8]

for x in lst:
    print x

#二次元配列の任意の行の値を取り出すクロージャをかえす
#http://tanopy.blog79.fc2.com/blog-entry-5.html
lst = "data-" + str(a) + "-" + str(b) for a in xrange(4)]
       for b in xrange(4)]

print lst

f0 = lambda i : [val[i] for val in lst]
for x in f0(0):
    print x

#ジェネレータ式
#↑上のだと、
# lst = "data-" + str(a) + "-" + str(b) for a in xrange(4)]
#       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#        for b in xrange(4)]
#このリストを内部的につくってしまうのが無駄
#ここをジェネレータにすればメモリがおとく。
#なのでジェネレータ式を使う。(ってことなんだと思う。たぶん)

#あ、その後結局
#f0 = lambda i : [val[i] for val in lst]
#としてるから
# lst = "data-" + str(a) + "-" + str(b) for a in xrange(4)]
#        for b in xrange(4)]
#のリスト全体がいらない
#ということは。。。
it = *1
       for b in xrange(4))
print it

f0 = lambda i : (val[i] for val in lst)
for x in f0(0):
    print x
#これでメモリ効率はよくなった(たぶん・・・)