ホーム>source

Pythonリクエストライブラリを使用して、APIからデータを取得しています。 データはメッセージと呼ばれる大きなjson配列で返されます。多くの個別の「メッセージ」サブレベルjsonが含まれています(下部のjson応答のサンプルを参照)。

このjson応答では、メッセージごとに、気になるデータポイントが数個(2または3)しかありません。これらのいくつかのデータポイントを取得して何か(リストのリスト、ディクショナリなど)に保存して、後で参照したり、オブジェクトに保存して別の関数から使用したりできるようにする必要があります。

保存する必要があるデータポイントは id です 、 conversationId 、および body. The id is unique, while the conversationId`は、会話のすべてのメッセージで共有されるため、一意ではありません。

  1. まず、これを達成するための最善の方法をあなたがどう思うかを尋ねたいと思います。リストのリスト、またはリストの辞書を推測していますか?私はあまりに新しいので、どちらがより良い解決策であるかわかりません。
  2. さらに、どの方法を選択した場合でも、別の関数からオブジェクトに保存するには、それらを参照し、IDで呼び出す方法を知る必要があります。それをうまく行う方法を私はまだ理解していません。

これが私がこれを行う方法の大まかなアイデアを得るためだけに試みたいくつかのことです:

<前>ウィズウィズ

^^ここでは、特定のメッセージの本文を参照できるかどうかを確認しようとしていますが、機能しませんでした。

<前>ウィズウィズ

^^これは実際にはいくらか機能しますが、後で呼び出すためにデータを効果的に整理することはできません。辞書を印刷すると、最新 値。キーは一意ではないため、追加ではなく上書きされます。これは私がリストのリストが一番良いものにする理由です。

結局、 response=requests.get(url + id, headers=h, params=p) messages=json.loads(response.text) for message in messages: print(message['body']) によってデータが整理されるソリューションが欲しい辞書またはこのような構造を持つ類似のもので、 r=requests.get(url + id, headers=h, params=p) inbound_dict = {} inbound=json.loads(r.text) for item in inbound['messages']: inbound_dict[item['conversationId']] = item['body'] print(inbound_dict) でメッセージを参照できます 、または conversationId 、そしてそれをすべて保存するためのきれいで読みやすい方法... conversationId

ウィズウィズ

最後に、jsonのサンプルを次に示します。私はまだpythonについて学習し、習熟していることを覚えておいてください。いつもありがとうございました!

<前>ウィズウィズ msgId
あなたの答え
  • 解決した方法 # 1

    同じconversation_idのアイテムを複数持つことができる場合は、次のようにすることができます。

    <前>ウィズウィズ

    結果のデータ構造は、conversation_idをキーとして持つディクショナリーであり、各conversation_idは r=requests.get(url + id, headers=h, params=p).json() inbound_dict = {} for item in r['messages']: conv_id = item['conversationId'] if conv_id not in inbound_dict: inbound_dict[conv_id]=[{'msg_id' : item['id'], 'body' : item['body']}] else: inbound_dict[conv_id].append({'msg_id' : item['id'], 'body' : item['body']}) print(inbound_dict) にマップされます   list の  アイテム。各アイテムには、特定のメッセージのmessage_idと本文が格納されます。次に、conv_idキーに保存されているメッセージのリストを取得することにより、特定の会話のメッセージを反復処理できます。

    または、次のデータ構造を選択してマッピングできます。 ウィズウィズ 。

    これは次のように実装できます。

    <前>ウィズウィズ

    この場合、con_idとmessage_idがわかっていれば、会話から直接メッセージにアクセスできます。

    そのため、このデータ構造のダウンストリームユーティリティに依存します。

    上記はリスト内包表記でも実現できます。

  • 解決した方法 # 2

    次のように、リストと辞書の組み合わせを使ってそれを行うことができます:

    <前>ウィズウィズ

    出力:

    ウィズウィズ
    

    次のようにすることで、より多くのデータを活用して、内包の反復コーディングの多くを排除し、より簡潔にすることができます。

    <前>ウィズウィズ

  • 解決した方法 # 3

    私の理解では、会話で取得できるデータ構造のメッセージが必要です。これが私がすることです:

    <前>ウィズウィズ

    ただし、後で実行する処理とその処理によっては、やり過ぎになる可能性があります。彼らに会話を選択させ、最後の20件のメッセージを表示させるだけの場合は、スライス可能なリストが内部データ構造の最良の選択である可能性があります。その場合は、次のようにします。

    <前>ウィズウィズ

    基本的には同じ操作ですが、defaultdictを使用すると、異なるタイプの内部コレクションを入力できます。

    dict

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ django - データを変更して保存すると整合性エラーが発生する