2017-08-10 25 views
1

文字列を辞書の場所に変換する方法があるかどうかを調べようとしています。私は、サンプルコードが私がしようとしていることを説明するのが最も簡単だと思います。Pythonの文字列を辞書の場所に変換する

def main(locate_user_id): 
    response = { 
     "users": [{ 
      "id": 1, 
      "name": "Joe" 
     }, { 
      "id": 2, 
      "name": "Bob" 
     }] 
    } 
    print(response) 
    print (locate_user_id) 
    print (response[locate_user_id]) 

if __name__ == "__main__": 
    main("users[1]['id']") 

これの出力は、現在、次のとおりです。

{'users': [{'id': 1, 'name': 'Joe'}, {'id': 2, 'name': 'Bob'}]} 
users[1]['id'] 
Traceback (most recent call last): 
    File "test_dict.py", line 17, in <module> 
    main("users[1]['id']") 
    File "test_dict.py", line 14, in main 
    print (response[locate_user_id]) 
KeyError: "users[1]['id']" 

そして私は、出力の代わりに、このするソリューションを探しています:

{'users': [{'id': 1, 'name': 'Joe'}, {'id': 2, 'name': 'Bob'}]} 
users[1]['id'] 
2 // the id of the user referenced above 
+1

コードを再設計することを検討する必要があります。これは悪いデザインです。 –

+0

ここには本当に残酷な答えがいくつかあります。 'eval'を使わず、intを渡してデータにアクセスできるようにコードを再設計してください。 – skrx

答えて

-2

文字列は文字列です。 Pythonの構文を理解するには、Pythonインタプリタが必要です。スクリプトのスコープ内でインタプリタを呼び出すには、evalを使用できます。機能mainの範囲内の文字列response['users'][1]['id']を評価しているこれが何をやっている

def main(locate_user_id): 
    response = { 
     "users": [{ 
      "id": 1, 
      "name": "Joe" 
     }, { 
      "id": 2, 
      "name": "Bob" 
     }] 
    } 
    print(eval('response' + locate_user_id)) 

if __name__ == "__main__": 
    main("['users'][1]['id']") 

は、あなたが望むように動作するようにevalためのスクリプトに若干の変更を必要とします。

どのようなユースケースであっても、evalを使用することは、Googleにはさまざまな理由でおすすめできません。 evalの使用を必要としないように、コードをリファクタリングしてみます。

+0

なぜこれがダウン投票されていますか? – JoshuaRLi

+1

OPは間違った質問を(それを気づかずに)尋ねています。それはあなたが答えたものです。彼/彼女が実際に望んでいるのは、ネストされたデータ構造からデータを取り出す方法を理解することです。この場合、正しいuserIdプロパティを含む要素のリストを検索する方法 – jpaugh

+0

いいえ...OPが彼のサンプルコードでネストされたアクセス表記法を持っているという事実は、彼が意識していることを意味します。 – JoshuaRLi

0

使用ast.literal_eval

>>> import ast 
>>> ast.literal_eval{PUT YOUR LIST HERE} 
+2

これは有効なPython構文ではありません。 –

0

私は、これはトリックを行うと思います。少し汚れても機能します!

evalを使用せずに
def main(locate_user_id): 
    response = { 
     "users": [{ 
      "id": 1, 
      "name": "Joe" 
     }, { 
      "id": 2, 
      "name": "Bob" 
     }] 
    } 
    print(response) 
    print(locate_user_id) 

    keys = locate_user_id.replace(']','').split('[') 
    keys[0] = '"' + keys[0] + '"' 
    eval_str = '[' + ']['.join(keys) + ']' 

    print(eval(str(response) + eval_str)) 


if __name__ == "__main__": 
    main("users[1]['id']") 
0

、そしてあなたの入力を若干修正して、あなたが悪evalを使用せずに、添え字アクセスを評価することが可能であるstr.formatを使用して欲しいものを達成することができます

def main(locate_user_id): 
    response = { 
     "users": [{ 
      "id": 1, 
      "name": "Joe" 
     }, { 
      "id": 2, 
      "name": "Bob" 
     }] 
    } 

    print(("{"+locate_user_id+"}").format(response)) 


if __name__ == "__main__": 
    main("[users][1][id]") # instead of "users[1]['id']" 

結果:2

0

コードを再構成する方法の1つです。この関数は単にレスポンスとインデックスを取得し、ユーザーリストの対応する要素を出力します。その後、

また
def locate_user_id(response, user_id): 
    for user in response["users"]: 
     if user["id"] == user_id: 
      print(user) 

、あなたがデータを再編成することができるしている場合、あなたは:

response = { 
    "users": [ 
     {"id": 1, "name": "Joe"}, 
     {"id": 2, "name": "Bob"} 
     ] 
    } 

def locate_user_id(response, user_id): 
    print(response["users"][user_id]["id"]) 

locate_user_id(response, 1) 

あなたが実際に渡されたID番号を持つユーザを取得したい場合は、ユーザーのリストを反復処理することができます

response = { 
    "users": { 
     1: "Joe", 
     2: "Bob", 
     } 
    } 
関連する問題