python、苦手ですぅ・・・><
なんというか、matlabほど直観的じゃなくて、javaほどIDE発達してないから
沢山覚えないといけないし。
今日はリストとかglobの仕方を教えてもらいました!
リストのiteration
リストalistの中身を順番に見ていく行動をするときの
関数の使い分け。
本当にリスト(orタプルも?)ならば
for a in alist:
print a
# end of a-for
で、alist内の各要素 a を取ってくれる。
enumerate関数は、インデックス番号も欲しいときだけ使う。
for idx, a in enumerate(alist):
print a
print idx
で、alist内の各要素aとそのインデックスidx(=数字)が出てくる。
通常のfor文的にやるにはrangeを使うが、これはあまり良くない、らしい。
for idx in range(len(alist)):
a = alist[idx]
これがJavaでいうところの
for(int idx = 0;idx < alist.length;idx++){
System.out.print(alist[idx]);
と一致ってことね。
ユニークなリスト要素の取得
下記が一番簡単。original_listは非破壊。
unique_list = list(set(original_list))
return unique_list
説明すると、set関数は引数のリストのユニークな集合だけを抜く。
でも、これはset型でリストではないので、
再度list関数でかぶせてリストに戻す。
これは簡単。
空の要素(None)の削除
これはリスト内包表記が一番簡単。
withoutNoneList = [x for x in withNoneList if x]
Noneだと、最後の if xがviolateするから出てこない。頭いい!
多重リストの展開
flatten的な。
でもある。
簡単なのは、すべて1段の入れ子の場合。
このときは二重の内包表記が早い。
flattened = [item for sublist in l for item in sublist]
本当に愚直に展開しているだけだね。
globするか、フィルターするか
ファイル名とかを探して引っこ抜く方法。
これは2種類あって、どっちでも同じようだ・・・
import glob
filelist = glob.glob("dir/*")
import os
filelist = os.listdir(dir)
具体的にファイル名とかを絞る場合は、globの場合は直接書き込む。
listdirの場合はfilter関数というのを使うらしい。
filter関数はmatlabのfindの感覚に近いなぁ。
import glob
filelist = glob.glob("dir/*.txt")
import os
filelist = os.listdir(dit)
txtfiles = filter( lambda x:x.find("txt")!=-1, filelist)
この例だと、globはdir内の全ての*.txtファイルをゲットする。
filter側は、dir内で、名前のどこかにtxtが入っているファイルを全部ゲットする。
なお、返り値はどちらもリストの模様・・・