- 1. 概要
- 2. リストからリストを抽出
- 3. リストから要素を抽出
1. 概要
確か、「java」を例に出して、説明していたサイトがあったのですが、参考サイトとして掲載しようとしていたのに、閉じちゃったので、忘れちゃいました。
わたしは、「java」は、からっきしわからないので、「C#」で例にすると。
「C#」の「List」型でいう、「findall」や「find」がやりたかったのです。
「Python」だと少し、ひねった感じ。
本ページは、下記のサイトを参考にさせていただきました。
「Python のリストから条件に合致する最初の要素を検索(find)する方法」
2. リストからリストを抽出
「C#」でいうところの「findall」ですな。
「list」「filter」「lambda」ちゅうものを使います。
文系なもので「lambda」ちゅうのがさっぱり意味不明ですが、使うことはできます。
class myClass:
def __init__(self, i, s):
self.i = i
self.s = s
mylist = [
myClass(2, 'Y'),
myClass(1, 'Z'),
myClass(3, 'X'),
myClass(5, 'Y'),
myClass(2, 'X'),
myClass(2, 'Z'),
]
xs = list(filter((lambda x: x.s == 'X'), mylist))
print('X を持つもの')
for one in xs:
print(one.i, one.s)
というソースを書いて実行すると、下記の結果が得られます。
X を持つもの
3 X
2 X
3. リストから要素を抽出
「C#」でいうところの「find」ですな。
これは、前項の「list」の代わりに「next」を使用します。
また、「C#」は、抽出条件に沿うものがない場合は、「null」が返ってきますが(要素が nullable 出ない場合は、また別)、「Python」の場合は、例外が発生します。
「next」の第二引数にデフォルト値を置くことで、例外が発生する代わりに、デフォルト値がセットされます。
class myClass:
def __init__(self, i, s):
self.i = i
self.s = s
mylist = [
myClass(2, 'Y'),
myClass(1, 'Z'),
myClass(3, 'X'),
myClass(5, 'Y'),
myClass(2, 'X'),
myClass(2, 'Z'),
]
x2 = next(filter((lambda x: x.s == 'X' and x.i == 2), mylist), None)
if (x2 != None):
print('X 2 を持つものはあります')
else:
print('X 2 を持つものはありません')
x1 = next(filter((lambda x: x.s == 'X' and x.i == 1), mylist), None)
if (x1 != None):
print('X 1 を持つものはあります')
else:
print('X 1 を持つものはありません')
というソースを書いて実行すると、下記の結果が得られます。
X 2 を持つものはありません
X 1 を持つものはあります
|