paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

pythonの空リストの判定について

現場での勤務表を作る過程でcsvファイルをExcelに転記するという作業をpythonで行ったのですが、 空リストの判定に少し引っかかりましたのでメモっておきます。

処理

実際のコードは書きませんが大まかな流れは以下の通りです。

  1. 勤怠のcsvファイルを読み込み
  2. 読み込んだデータを別のリストへ格納
  3. リストをExcelへ転記
    • 休日分は空の値として空欄を転記

空リストのサンプル

わざわざ再現する必要はありませんが、空リストが出た過程を追います。
別環境で再現するので作業は簡略して書いてみます。

  • 勤怠データをリストへ格納

上記の1と2をpythonのプロンプト内で再現します。
本記事で使用しているのは3.8.10です。

>>> import csv
>>> labor = '''\ # 勤務のタイムカードのcsvファイル、空行は休日
... 9:00,17:30
... 9:00,17:30
... 9:00,17:30
... 9:00,17:30
... 9:00,17:30
... 
... 
... 9:00,17:30
... 9:00,17:30
... 9:00,17:30
... 9:00,17:30
... 9:00,17:30\
... '''
>>> labor.split('\n') # csvモジュールに渡すようにリスト化
>>> time = [x for x in csv.reader(labor.split('\n'))]

  * リストの中身

サンプルの10営業日分ですが、以下のように格納されています。

>>> time
[['9:00', '17:30'], ['9:00', '17:30'], ['9:00', '17:30'], ['9:00', '17:30'], ['9:00', '17:30'], [], [], ['9:00', '17:30'], ['9:00', '17:30'], ['9:00', '17:30'], ['9:00', '17:30'], ['9:00', '17:30 ']]

ループさせた各データをExcelの出勤と退勤のセルに当てていけば完了です。
(本記事ではExcelファイルとExcel用モジュールは登場しません)

>>> time[0]
['9:00', '17:30']

休日分が空リストになっていますが、条件文で空リストを判別して休日分は空欄を当てはめるという処理がうまいこと動きませんでした。

>>> time[5]
[]

空リストについて

空リストの真偽値がどうなるかが分かれば解決します。
ドキュメントを見る前にターミナルでちょっと見てしまいましょう。

とりあえずNoneや空文字では無い様です。

>>> time[5] == None
False
>>> time[5] == ''
False

ここでデータタイプを見てみます。

>>> type(time[5])
<class 'list'>

やはりと言ってはなんですがリスト型ですね。
じゃあそのまま値の入ってないリストでは?ということで試したらTrueが返ってきました。

>>> time[5] == []
True
>>> time[5] == list()
True

考えたら当たり前のことですが、意外とスッと出てきませんでした。
実際の私のコードではこれで判別してます。

その他

statementの仕様から判別

PEP8の推奨だと空のシーケンスはFalseが返るのでその仕様を使えとありました。
空リストだとFalseが返るんですね。
(本当はこれをいの一番に確認して実装すべき)

>>> if not time[5]:
...   print('This is a empty list')
... else:
...   print('This is a list')
... 
This is a empty list
lenを使う

PEP8ではwrongになってますがlenで判別する方法もあります。
直感的な判定の考え方では無いですがこちらもシンプルですね。

>>> len(time[5]) == 0
True
tryでは使えません

無理やりtryでなんとかできないと思いましたがダメでした。

>>> for a in time[:8]:
...   try:
...     print(a)
...   except:
...     pass
... 
['9:00', '17:30']
['9:00', '17:30']
['9:00', '17:30']
['9:00', '17:30']
['9:00', '17:30']
[]
[]
['9:00', '17:30']

まとめ

今まで結構listをループさせての処理を書いてきましたが、意外と空リストに当たったことはなく、今回の処理で少し戸惑ってしまいました。
ここに書いて無くてすみませんが、綺麗なコードかは置いておいてとりあえず解決はできたので良かったです。
しかし基本的なところにもまだまだ自分の知らないことが潜んでいそうです。
とりあえず引き続き書いて覚えていくしかないですね。

参考サイト

PEP 8 – Style Guide for Python Code | peps.python.org

Declare an empty List in Python - GeeksforGeeks