# リスト2
# 検索の最適化
前回のようなループして検索する方法は非常に計算コストが高く、リソースの無駄となってしまいます。
そのため、Pythonでは最適化されたリストの検索方法を提供しています。
リストはfilter関数を使用して受け取ることができます。これはラムダ式で記述された無名関数を第1引数で受け取り、それを第2引数のリストの各要素に適用します。
以下の例では最後にlist()を使用してリストに変換しています。
無名関数とは
名前のない関数のことで一度しか使わない関数に使用されます。
普通の関数を定義していると関数の名前が衝突して関数の内容が上書きされるためこちらの方が便利なこともあります。
>>> fruits = ["apple", "lemon", "melon", "orange"]
>>> lst = list(filter(lambda x: x.endswith("n"), fruits))
>>> print(lst)
['lemon', 'melon']
lanbdaの後のxに数値が代入され、endswith()を使用して条件と合致しているか(この例では終わりの文字がnであるかどうか)を判別しています。
# 辞書(Dictionary)型
辞書はkeyとvalueによって構成され、keyを使用してvalueを取り出すことが可能です。
以下のpersonのような、[{"test":"true"}]のような形式を辞書形式と言います。
>>> person = [{"name":"taro", "transport":"JR", "station":"上野芝"}, {"name":"jiro", "transport":"JR", "station":"三国ヶ丘"}, {"name":"kobayashi", "transport":"metro", "station":"淀屋橋"}]
>>> print(person[0]["name"])
taro
辞書形式でも検索を行うことが可能です。
>>> lst = list(filter(lambda x: x["transport"] == "JR", person))
>>> print(lst)
[{'name': 'taro', 'transport': 'JR', 'station': '上野芝'}, {'name': 'jiro', 'transport': 'JR', 'station': '三国ヶ丘'}]
keytransportのvalueがJRであるものを取得して出力しています。
ここからstationだけを取り出したい場合にはここからさらにループを使用して取り出します。
# 演習5-2-1
以下のリストの中から歳が30歳以上の人を抽出し、cityを取得してコンソールに出力せよ。
person_list = [
{"name": "Alice", "age": 25, "city": "New York"},
{"name": "Bob", "age": 30, "city": "San Francisco"},
{"name": "Charlie", "age": 22, "city": "Los Angeles"},
{"name": "David", "age": 35, "city": "Chicago"},
{"name": "Eva", "age": 28, "city": "Miami"}
]