i-focus i-focus BB
    • カテゴリ
    • 最近
    • タグ
    • 人気
    • ユーザー
    • グループ
    • 登録
    • ログイン
    1. ホーム
    2. i_yamasaki
    3. スレッド
    • プロフィール
    • フォロー中 0
    • フォロワー 0
    • スレッド 4
    • 投稿 5
    • ベスト 3
    • Controversial 0
    • グループ 0

    i_yamasakiがスレッドを作成しました

    • i_yamasakiI

      lambdaの内包表記で躓いた話

      Python
      • python • • i_yamasaki
      1
      0
      Votes
      1
      投稿
      225
      閲覧数

      返事はまだありません

    • i_yamasakiI

      今日の学び:集合型に辞書型を入れることはできない

      Python
      • python • • i_yamasaki
      2
      0
      Votes
      2
      投稿
      322
      閲覧数

      i_yamasakiI

      集合型にはミュータブル型(変更不可)しか入れられないのが原因らしい。

      辞書はイミュータブル型(変更可能)だから入らなかったので一度文字列(ミュータブル型)に変換して入れた後にリストに入れれば疑似的に重複を削除できた。

      import json dlist = [ {"a": 1}, {"a": 1}, # 同じ値 {"b": 2}, ] dlist_new = [json.loads(d_str) for d_str in {json.dumps(d_dict) for d_dict in dlist}] # dlist_new = [{"a": 1}, {"b": 2}] # dlist_newの中身は順不同

      ミュータブル型に変換するのであれば辞書のキーにしてしまい値だけ取り出す方法でもできることに気が付いた。こちらのほうがすっきりしていて見やすい気がする。また、愚直に集合型を使用しないので中身が元のリストの出現順になる。

      import json dlist = [ {"a": 1}, {"a": 1}, # 同じ値 {"b": 2}, ] dlist_new = list({json.dumps(d): d for d in dlist}.values()) print(dlist_new) # dlist_new = [{"a": 1}, {"b": 2}]

      辞書の要素の順がすべて同じであると保証されている場合はこれでも良いが、よく考えると要素の出現順が違うとこの方法だとうまくいかないことに気が付いてしまった。

      import json dlist = [ {"c": 3, "a": 1}, {"a": 1, "c": 3}, # 同じ値、ただし順番は違う {"b": 2, "c": 3}, ] dlist_new1 = [json.loads(d_str) for d_str in {json.dumps(d_dict) for d_dict in dlist}] # [{'c': 3, 'a': 1}, {'a': 1, 'c': 3}, {'b': 2, 'c': 3}] # 重複削除失敗 dlist_new2 = list({json.dumps(d): d for d in dlist}.values()) # [{'c': 3, 'a': 1}, {'a': 1, 'c': 3}, {'b': 2, 'c': 3}] # 重複削除失敗

      辞書の順をソートしても良いが、ネストが深い場合にどうにもならないので比較するしかなさそう。すでに出てきた辞書を追加するリストを使う方法が最初に浮かんだ。

      dlist = [ {"c": 3, "a": 1}, {"a": 1, "c": 3}, # 同じ値、ただし順番は違う {"b": 2, "c": 3}, ] dlist_new = [] for d in dlist: if d not in dlist_new: dlist_new.append(d) # dlist_new = [{'c': 3, 'a': 1}, {'b': 2, 'c': 3}]

      ただどうしてもワンライナーで書きたかったので考えていたところ、dlist内の比較結果が同じもので作成したリストを文字列に変換し、それをキーにしてリスト内の比較結果が同じものを紐づける方法を思いついた。

      import json dlist = [ {"c": 3, "a": 1}, {"a": 1, "c": 3}, # 同じ値、ただし順番は違う {"b": 2, "c": 3}, ] dlist_new = list({json.dumps([_d for _d in dlist if d == _d]): d for d in dlist}.values()) # [{'a': 1, 'c': 3}, {'b': 2, 'c': 3}] # 同じ内容の場合後に出てきたものが入る

      あまり賢い方法には思えないがこれが一番スッキリしていると思う。

    • i_yamasakiI

      深いネストを持った辞書型から安全かつ簡潔に値を取り出したいので調べた

      Python
      • python • • i_yamasaki
      2
      1
      Votes
      2
      投稿
      412
      閲覧数

      N

      JavaScriptも同様の問題があり、ライウラリー探したけど、いまいちなので自作しました。
      pythonも多分同じ方法で出来ると思います。

      /**

      オブジェクトのプロパティの存在チェック&取得 パラメータ: obj : 任意のオブジェクト path : チェックしたいデータがあるプロパティをパス形式で渡す (フォーマット例 "a.b.c") 戻り値: プロパティにデータがある場合はデータを返し、無い場合はnotExistの指定が無い場合は"undefined"を返す

      */
      Object.propatyGet = function(obj, path, notExist=undefined) {
      return path.split('.').reduce((obj, prop) => { return obj && obj[prop] ? obj[prop] : notExist; }, obj);
      }

    • i_yamasakiI

      テスト

      Python
      • python • • i_yamasaki
      2
      1
      Votes
      2
      投稿
      345
      閲覧数

      koukouK

      @i_yamasaki 🙄 Pythonを勉強したいんです