Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

Python: リストとglobとフィルターと

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的な。

stackoverflow.com

でもある。

簡単なのは、すべて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が入っているファイルを全部ゲットする。

なお、返り値はどちらもリストの模様・・・