ホーム>source

PythonでClojureのget-in関数に相当するものはありますか?あるデータ構造の特定のパスでデータを取得します。

Clojureでは、次のように使用されます。

(def employee
  {:name "John"
   :details {:email "info@domain.com"
             :phone "555-144-300"}})
(get-in employee [:details :email])  ; => "info@domain.com"

Python構文に変換すると、次のように使用されます。

dictionary = {'a': {'b': 10}}
get_in(dictionary, ['a', 'b'])  # => 10

この関数は、パスがコンパイル時に不明で、動的であるネストされたデータ構造内の任意のデータポイントにアクセスするために使用されます。 get-in のその他の使用例  で見つけることができますclojuredocs。

あなたの答え
  • 解決した方法 # 1

    あなたは書ける:

    dictionary.get('details', {}).get('email')
    
    

    これにより、必要な値または None を安全に取得できます 、例外をスローせずに-Clojureの get-in のように  します。

    そのための専用機能が必要な場合は、次のように記述できます。

    def get_in(d, keys):
        if not keys:
            return d
        elif len(keys) == 1:
            return d.get(keys[0])
        else:
            return get_in(d.get(keys[0], {}), keys[1:])
    
    

  • 解決した方法 # 2

    いいえ、しかし、あなたは確かに1つを作ることができます

    def get_in(d, keys):
       if not keys:
           return d
       return get_in(d[keys[0]], keys[1:])
    
    

  • 解決した方法 # 3

    単純なforループで問題を解決できます-

    x = {'a':{'b':{'c': 1}}}
    def get_element(elements, dictionary):
        for i in elements:
            try:
                dictionary = dictionary[i]
            except KeyError:
                return False
        return dictionary
    print(get_element(['a', 'b', 'c'], x))
    # 1
    print(get_element(['a', 'z', 'c'], x))
    # False
    
    

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ .htaccess - htaccessはすべてのルールを書き換えません