Python frozenset()ってなんだ??

公式ドキュメントをまずは確認。

set()のイミュータブル版(Read only)か、なるほど。

イミュータブルなんで、setで使用してたadd()、remove()とかは当然使えましぇん↓↓

>>> fs = frozenset()
>>> fs.add(1)  # <---ホントにイミュータブルか??
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add' #<--- Yes, ホントにイミュータブルやで。

codewarsの猛者達は、forzensetをdictのkeyとして使用していた。

- dict[forzenset()] = XXX 

問題と解のコードを読むと、なるほどと思ったり、世界は広しと思ったり。
そんな時に思い浮かんだ言葉。


自分がわからないことに遭遇するときや、知らないことに出会ったときに、「お、自分はまだまだいける」と思います。 by イチロー


イチロー、ありがとう。 そして、マラドーナ、ありがとう。

Python defaultdict()ってなんだ??

codewarsにて、defaultdict()を使っての解法があり、知らなかったのでここに記す。

defaultdict()の使い方

公式ドキュメントでは、下記記載があり。

  • ファクトリ関数を呼び出して存在しない値を供給する辞書のサブクラス

  ※ファクトリ関数って、キーが見つからない場合に、初期値を提供する関数とのこと。

>>> from collections import defaultdict
>>>
>>> dd = defaultdict(int)
>>> dd[2] # <---未登録のkey:2でも例外とならず、0が表示される。
0
>>> int() # <---defaultdict()の引数で指定した"int()"は0を返すから、さっきは0が初期値となった。
0
>>> 

なるほど。

下のように、valueの型を指定(というか制限)するのにも良いのかも。

>>> dd = defaultdict(str)
>>> dd[2]
''
>>> dd[2] += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
>>> 

使いどころいっぱいありそうなので、ちょっと覚えておこうか。

any(), all()ってなんだ??

codewarsにて、any(), all()を使っての解法があり、知らなかったのでここに記す。

all(), any()の使い方

引数として、イテラルなオブジェクト(list, tuple, set, etc)をとり、

  • all() は、それらが全てTrueであれば、Trueを返す
  • any()は、それらのうち、1つでもTrueであれば、Trueを返す
>>> all([True, False, True])
False
>>> 
>>> any([True, False, True])
True
>>> 

こんな感じ!!

AND回路(=all)とOR回路(=any)みたいな感じかな。

Python Comprehensionシリーズ

Codewarsにて、よく使うComprehensionシリーズは↓↓

  • [] : Dictionary

  • {} : Set or Dictionay

  • () : Genarator


Dictionary Comprehension

例えば、0~9までの数字で偶数のリストを作成する場合。

 l = [i for i in range(10) if i % 2 == 0 ]
 >>> l : [0, 2, 4, 6, 8]


Set Comprehension

例えば、要素が重複するリストから重複しない集合を作成する場合。

s = {i for i in [1,1,1,1,2,2,2]}
>>> s : {1, 2}

この場合、set()を使えばできるけど、より複雑な処理の場合、Comprehensionを使った方がいいこともある。

ケースバイケース。


Dictionary Comprehension(Set Comprehensionとの違いは、key:valueで指定)

例えば、keyが0-4までの値, valueがkey2倍のDictを作成する場合。

d = {i:i*2 for i in range(5)}
>>> d : {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}


Generator Comprehension

例えば、0-9の数字のうち、3の倍数を吐くジェネレータを作成する場合。

g = (i for i in range(10) if i % 3 == 0)
for i in g:
    print(i)
>>> 0, 3, 6, 9が表示

Python リストを複数キーでソートするの巻

ちょこちょこ解いているcodewarsにて、
Pythonのあるリストを、複数キーでソートする問題を解いたのである。

code snippet:
ll = sorted(l, key=lambda x : (-len(x), x[0], x[2:]))
# l:string(数字,アルファベット、記号の組合せ)要素を持つリスト
  1. 長い順に並べて
  2. 長さ同じであれば、文字列の一番最初の文字の若い順に並べて
  3. それでも同じであえば、x[2:]以降の文字列の若い順に並べる
Point
  • keyをtupleで渡すと順に評価してくれるらしい。
  • lenにマイナスをつけると、降順になる。 最初は、ん?Why?。。後にア、ハア!!!!なるほ!!!!となり候。

IDIA Issac SDKのセットアップ時のエラー出火から鎮火まで。

実行環境
  • Issac version : Isaac SDK 2020.1
  • HW : Jetson nano
  • HostPC: Ubuntn 18.04
エラー内容

ドキュメントの"Setup"章の”Installing Dependencies on Robots”を実行してみると、 多数エラー(3つ)が発生。
最初の最初でコケた。。。前途多難だ。。。

ドキュメントでは、下記スクリプトを実行するだけって書いてあるんだぜ。。

bob@desktop:~/isaac$ engine/build/scripts/install_dependencies_jetson.sh -u <jetson_username> -h <jetson_ip>


エラーその1
ModuleNotFoundError: No module named 'pkgconfig'

---> 対策: [on JetsonNano] $ python3 -m pip install --user pkgconfig

エラーその2
c/_cffi_backend.c:15:10: fatal error: ffi.h: No such file or directory

---> 対策: [on JetsonNano] $ sudo apt-get install libffi-dev

エラーその3
environment: line 13: jupyter: command not found

---> 対策: sshでのログイン時に、"source ~/.profile"を実行するように、インストールスクリプトを修正(sshでログインするとjupyterのとこにパスが通ってなかった)


明日は、サンプルアプリでも動作させようか
ただ、シミュレーション環境で必要なGPUスペックがない。。。
サンタさんが、RTXシリーズのカードくれないかな〜〜

Pythonの文字列で、最頻出の文字を抽出する方法

今日のCodewarでガクッとしたこと
Pythonの文字列の中で、最頻出の文字を抽出する方法の違い

Codewar上級者達は...

>>> stg = "1222223344445"
>>> max(stg) # keyを何もしないと単純な最大値
'5' 
>>> max(stg, key=stg.count) # keyでカウントする関数を指定
'2' 
>>> 

VS 自分はfor文をぶん回してのmaxを検索.... 


追加で、
”文字列” --> ASCII --> "接頭辞”0b”なしの2進数表記の文字列" にする場合..

>>> f"{ord(char):08b} # Codewar上級者
>>> f"{bin(ord(c))[2:]:0>8}" #自分

無駄が多すぎる。。精進しなければ。。