かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Python3 要素が n の配列を生成したい

データを突っ込む初期値として [0, 0, 0] とか [[], [], []] みたいな配列を作りたい

* n で要素を繰り返した配列が作れる

data = [0] * 3
# [0, 0, 0]

* n する配列の要素全てが n 回繰り返される

data = [1, 2, 3] * 3
# [1, 2, 3, 1, 2, 3, 1, 2, 3]

要素に配列や辞書を持つリスト作成は注意が必要

* n の繰り返しは同じ要素を繰り返しているので参照値である配列や辞書は同じ参照を持つものが繰り返されてしまうので注意が必要

配列

data = [[]] * 3
# [[], [], []]
data[0].append(1)
# [[1], [1], [1]]

辞書

data = [{}] * 3
# [{}, {}, {}]
data[0]['foo'] = 'bar'
# [{'foo': 'bar'}, {'foo': 'bar'}, {'foo': 'bar'}]
data[0].update({'foo': '1', 'bar': 2})
# [{'foo': '1', 'bar': 2}, {'foo': '1', 'bar': 2}, {'foo': '1', 'bar': 2}]

参照のデータを要素にしたい場合は素直にリスト内表記で作成すればOK

配列

data = [[] for i in range(3)]
# [[], [], []]
data[0].append(100)
# [[100], [], []]

辞書

data = [{} for i in range(3)]
# [{}, {}, {}]
data[0]['foo'] = 'bar'
# [{'foo': 'bar'}, {}, {}]
data[2].update({'foo': '1', 'bar': 2})
# [{'foo': 'bar'}, {}, {'foo': '1', 'bar': 2}]

おまけ: 辞書は * n できない

{'a': 1} * 3
TypeError: unsupported operand type(s) for *: 'dict' and 'int'

所管

簡単に要素が n 個の配列・辞書を作ることが出来ました!
参照なデータを要素に取る時だけ作り方に注意が必要そうです。

思い出したかのように時々触るくらいなので覚えられない!


[参考]

Pythonでつくる ゲーム開発 入門講座

Pythonでつくる ゲーム開発 入門講座

ゲーム作るの楽しそう!

🐍 繋がりだけでサムネにしようと貼った邪神ちゃん

環境構築 macOS Big Sur : anyenv の pyenv で Python を使えるようにした

Python 環境した構築のメモ

  • macOS Big Sur
  • anyenv インストール済み
  • zah

前回までのあらすじ ( anyenv / nodenv のインストール )

anyenv で pyenv を使えるようにする

pyenv は nodenv と違ってインストールする必要があった

$ anyenv install pyenv
/var/folders/qj/1l6l5_d94f5837gzbbb6g8ww0000gn/T/pyenv.20210325231104.4478 …
Cloning https://github.com/pyenv/pyenv.git master to pyenv...
Cloning into 'pyenv'...
Install pyenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.
# インストールが完了したら指示に従ってシェルを再起動する
$ exec $SHELL -l
# Python のバージョンの確認
$ python --version
Python 2.7.16
# pyenv ではまだインストールしてないので次のような表示になる
$ pyenv versions
* system (set by /Users/<user>/.anyenv/envs/pyenv/version)

pyenv で Python のインストール

インストールできるバージョンを表示

この当たりは nodenv と同じ

$ pyenv install -l
Available versions:
  2.1.3
  2.2.33.8.8
  3.9.0
  3.9-dev
  3.9.1
  3.9.2
  3.10.0a6
  3.10-dev

今回は 3.9.2 をインストールしたいと思います。

Python のインストール

$ pyenv install 3.9.2
…
Installed Python-3.9.2 to /Users/<user>/.anyenv/envs/pyenv/versions/3.9.2
# インストールされたバージョンの確認
$ pyenv versions
* system (set by /Users/<user>/.anyenv/envs/pyenv/version)
  3.9.2

グローバルで使用する Python のバージョンを指定

$ pyenv global 3.9.2
# 確認
$ pyenv versions
  system
* 3.9.2 (set by /Users/<user>/.anyenv/envs/pyenv/version)
# 一応pyenvのパスを再設定しておく
$ pyenv rehash
# Python のバージョンの確認
$ python --version
Python 3.9.2

₍ ᐢ. ̫ .ᐢ ₎ ヨシ!!

所管

前は homebrew で pyenv を使っていたのですが、anyenv 入れたらこちらでも pyenv 使えるようになってて嬉しい。anyenv でコマンドがだいたい同じになると言語ごとに環境設定のこと色々覚える必要がなくなるのでとても嬉しい!


[参考]

退屈なことは Python にやらせよう… Flask とかも触ってたけど記事にできてないので追々…

Python データにコンマ , を含む CSV をいい感じに扱いたい

スプレッドシートで JINNER JOIN, OUTER JOIN をしたかったけど VLOOKUP 関数だと1つのセルしか取ることができなかったので、面倒くささが爆発して PythonスプレッドシートCSV でダウンロードして加工していました。
雑に file open して改行とコンマ , で配列にしていたら、JSONデータとか , を含むデータがあるとセルが壊れてしまったので、PythonCSVをいい感じに扱うのメモ。

sample.csv

id, name, data
1, 星宮 いちご, "{""type"": ""cute"", ""unit"": [""soleil"", ""STAR☆ANIS"", ""2wingS"", ""コスモス"", ""ラッキーストロベリー""]}"
2, 霧矢 あおい, "{""type"": ""cool"", ""unit"": [""soleil"", ""STAR☆ANIS""]}"
3, 紫吹 蘭, "{""type"": ""sexy"", ""unit"": [""soleil"", ""STAR☆ANIS""]}"

CSV が壊れてしまうダメな例

def readCSV(filePath):
  try:
    with open(filePath, "r", encoding="utf-8") as f:
      data = f.read().split("\n")
      return {
        "header": data[0].split(","),
        "data": [row.split(",") for row in data[1:]]
      }
  except Exception as err:
    print(err)
    return None

csvData = readCSV("sample.csv")
print(csvData)

↓ 出力結果

{
  'header': ['id', 'name', 'data'],
  'data': [
    ['1', '星宮 いちご', '"{""type"": ""cute""', ' ""unit"": [""soleil""', ' ""STAR☆ANIS""', ' ""2wingS""', ' ""コスモス""', ' ""ラッキーストロベリー""]}"'],
    ['2', '霧矢 あおい', '"{""type"": ""cool""', ' ""unit"": [""soleil""', ' ""STAR☆ANIS""]}"'],
    ['3', '紫吹 蘭', '"{""type"": ""sexy""', ' ""unit"": [""soleil""', ' ""STAR☆ANIS""]}"']
  ]
}

, を含むデータ部分で分割されてしまう
(ᐡ o̴̶̷̤ ﻌ o̴̶̷̤ ᐡ) ぴえぴえ

, を含む CSV データを扱う Good な方法

csv 標準ライブラリを使用する

csv.reader(csvfile, dialect='excel', **fmtparams)
与えられた csvfile 内の行を反復処理するような reader オブジェクトを返します。
cf. csv --- CSV ファイルの読み書き — Python 3.9.2 ドキュメント

import csv

def readCSV(filePath):
  try:
    with open(filePath, "r", encoding="utf-8") as f:
      reader = csv.reader(f)
      csvData = [row for row in reader]
      header, *data = csvData

      return {
        "header": header,
        "data": data
      }
  except Exception as err:
    print(err)
    return None

csvData = readCSV("sample.csv")
print(csvData)

↓ 出力結果

{
  'header': ['id', 'name', 'data'],
  'data': [
    ['1', '星宮 いちご', '{"type": "cute", "unit": ["soleil", "STAR☆ANIS", "2wingS", "コスモス", "ラッキーストロベリー"]}'],
    ['2', '霧矢 あおい', '{"type": "cool", "unit": ["soleil", "STAR☆ANIS"]}'],
    ['3', '紫吹 蘭', '{"type": "sexy", "unit": ["soleil", "STAR☆ANIS"]}']
  ]
}

いい感じのCSVがいい感じです!
₍ ᐢ. ̫ .ᐢ ₎ YATTANE!!!

ポエム

ふつーに考えたら split(",") なんてしたらデータ中にコンマ , 含まれてたらデータ壊れるわ。って考えがすっぽり抜け落ちてしまっていたのでお脳の劣化がやゔぁい…
3月から join した会社での稼働時間が毎日長すぎてコードかけないからドンドン忘れていっています!
若い人が多いのに MTG ばかりして、就業時間後くらいにしか作業ができない & 土日も働くのが平気みたいな文化で非常に辛い。全社MTGで新入社員紹介に付き合った人の遍歴言わせるとかパワハラ体質な感じもあって、最近の若い子は一周回って昭和的な文化なのか、営業的な考えの人が上層部にいるとそういう文化になってしまう環境起因のか、人間の性質形成の例として大変興味深くなっています。次はちゃんとしたテックカンパニーを探します…
コード書ける環境に身を置きたいので各位よろしくおねがいします!!


[参考]

いい感じのお皿がいい感じです!な まちカドまぞく 6巻読みたいけどどこに売ってるの〜?