40のおっさんのPython学習記録

20年以上前、学部の必修のC言語が全く理解できずに同級生に放り投げ、その後コーディングから遠ざかったガチ文系のおっさんが、ふと思い立ってPythonに挑戦しています。

新たな気づき(Chapter 6-3、6-4)

  • list_a.sort()はリストを書き換えてしまうが、list_b=sorted(list_a)は新たなリストを作る。
  • list_a.sort(reverse=True)、list_b=sorted(list_a,reverse=True)で降順にする。
  • リストの中の並びを単に逆にしたい場合はlist_a.reverse()(これExcelにはない)
  • list_a.sort(key=len)のように関数をキーにして文字の大きさ順にソートすることもできる。
  • list_a.sort(key=str.lower)で文字列のリストの中身を小文字にした上でソートできる。しないと大文字が先に来る。
  • 以下のようにすると、番号付きリストにできる。iとwhoを入れ替えてもかまわない。いずれにせよ最初の変数が数字、次の変数がリストから取り出した名前。(names,1)の1を置くことでカウンターの開始数値を1にできる。
names=["埋木","梅本","呻き","梅なんとか"]
for i, who in enumerate(names,1):
    print(i,who+"さん")
1 埋木さん
2 梅本さん
3 呻きさん
4 梅なんとかさん
  • zip関数を使うことで2つのリストをまとめてまわすことができる。
family=["埋木","梅本","呻き","梅なんとか"]
first=["幽閉","横柄","遊兵","幽霊"]
fullname=[]
for n1, n2 in zip(family,first):
    fullname.append(f"{n1} {n2}")
print(fullname)
  • リスト内包表記を使うことで上のコードは以下の様に書き換えられる。
family=["埋木","梅本","呻き","梅なんとか"]
first=["幽閉","横柄","遊兵","幽霊"]
fullname=[f"{n1} {n2}" for n1, n2 in zip(family, first)]
print(fullname)
  • リスト内包表記には条件式を含むこともできるし、複数の条件式でもいい。全ての条件式を満たすものが残る。
numbers=[2.1,9,"梅岡",8.0,"阪急梅田",1.6]
only_numbers = [num for num in numbers if isinstance(num,(int, float)) if num>5]
print(only_numbers)
  • data=[[1,2,3,4],[5,6,7],[8,9]]に対して以下のようにfor inを並べて書くと、
data=[[1,2,3,4],[5,6,7],[8,9]]
result1=[num*2 for alist in data for num in alist]
print(result1)
# [2, 4, 6, 8, 10, 12, 14, 16, 18]

リストの構造が崩れて単一のリストになってしまう。しかし、以下のように[[内側のネスト]外側のネスト]のように表記するとリスト構造が維持される。

data=[[1,2,3,4],[5,6,7],[8,9]]
result2=[[num*2 for num in alist] for alist in data]
print(result2)
# [[2, 4, 6, 8], [10, 12, 14], [16, 18]]

ちなみに、2つ上の事例でresult1=[num*2 for num in alist for alist in data]はエラーになる。やるにしても外側のネスト→内側のリストの順に書く。

  • 例えばlist_a=["呻き遊兵","梅玉幽閉","阪急梅田駅"]というリストに対して、"梅玉" in list_aとやっても、全く同一のデータがないので、Falseで返ってくるので、リストの文字列の一部があるかどうかを検索したい場合は以下のようにリストの中の文字列要素を一つづつ取り出してあるかどうかを確認することになる。
name=input("調べたい名前を入れて下さい:")
result3=False
for item in fullname:
    if name in item:
        result3=True   #あったらresult3をTrueで書き換える。
        break
print(result3)         #なければ書き換えられない元のFalseが表示され、あったら書き換わったTrueが表示
  • list_a.index("a")でaが何番目に含まれるかを表示。なければエラーが出るので、エラーが出そうな場合は例外処理を組み込んでおく。
  • list_a.count("a")でaが何個含まれるかを表示する。先ほどと同様にaxは違う扱い。
  • randomもしくはsecretモジュールのchoiceを利用すると、random.choice(list_a)とするとランダムに要素がピックアップされる。