Python - 文法 - 配列・リスト(list) - 抽出

 クラウディア
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 を持つものはあります
AbemaTV 無料体験