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 #これでメモリ効率はよくなった(たぶん・・・)