2017-11-08 7 views
1

Ich möchte die Werte aus einer Liste innerhalb eines Wörterbuchs erhalten. Ich erhalte die folgende JSON-Datenstruktur, wenn ich eine Oanda-REST-API-Anfrage mache.So erhalten Sie Schlüssel und Werte aus einem Wörterbuch innerhalb einer Liste in einem Wörterbuch

Wenn ich die get-Funktion verwende, kann ich auf das Diktat und die Schlüssel und seine Werte von "trades" und "lastTransactionID" zugreifen, aber nicht wissen, wie die Listenelemente im Schlüssel "trades" abgerufen werden.

Ich würde wirklich schätzen, wenn Sie ihr helfen könnten den Lauf

Works Druck rv.get ("Trades")

Funktioniert rv.get Druck nicht zu bekommen ("Trades"). erhalten ("Finanzierung")

{ 
    "trades": [ 
    { 
     "financing": "0.0000", 
     "openTime": "2017-11-08T17:21:49.533679739Z", 
     "price": "1.15901", 
     "unrealizedPL": "-0.0001", 
     "realizedPL": "0.0000", 
     "instrument": "EUR_USD", 
     "state": "OPEN", 
     "initialUnits": "1", 
     "currentUnits": "1", 
     "id": "2046" 
    }, 
    { 
     "financing": "0.0000", 
     "openTime": "2017-11-08T17:19:27.343697147Z", 
     "price": "1.15905", 
     "unrealizedPL": "-0.0001", 
     "realizedPL": "0.0000", 
     "instrument": "EUR_USD", 
     "state": "OPEN", 
     "initialUnits": "1", 
     "currentUnits": "1", 
     "id": "2044" 
    } 
    ], 
    "lastTransactionID": "2046" 
} 

Vielen Dank für Ihre Hilfe und freundlichen Grüßen

Antwort

2

Nur über die Liste iterieren:

for trade in rv.get("trades"): 
    print trade.get("financing") 

print rv.get("trades").get("financing") funktioniert nicht, weil rv.get("trades") eine Liste der Wörterbücher zurückgibt. Diese Wörterbücher sind diejenigen mit dem Schlüssel .

+0

Trades ist eine Liste mit zwei Komponenten. Es könnte auch sein: rv.get ("trades") [0] .get ("financing") und rv.get ("trades") [1] .get ("financing") – fernand0

+0

@ fernand0 richtig, noch besser zu iterate though, denn für eine andere Anfrage könnte die API eine andere Anzahl von Trades zurückgeben. – Bahrom

+0

Korrektes @Bahrom-Iterat scheint ein allgemeinerer Ansatz zu sein. – fernand0

0

Sie müssen nur über die Liste iterieren:

Demo here

data = { 
     "trades": [ 
     { 
      "financing": "0.0000", 
      "openTime": "2017-11-08T17:21:49.533679739Z", 
      "price": "1.15901", 
      "unrealizedPL": "-0.0001", 
      "realizedPL": "0.0000", 
      "instrument": "EUR_USD", 
      "state": "OPEN", 
      "initialUnits": "1", 
      "currentUnits": "1", 
      "id": "2046" 
     }, 
     { 
      "financing": "0.0000", 
      "openTime": "2017-11-08T17:19:27.343697147Z", 
      "price": "1.15905", 
      "unrealizedPL": "-0.0001", 
      "realizedPL": "0.0000", 
      "instrument": "EUR_USD", 
      "state": "OPEN", 
      "initialUnits": "1", 
      "currentUnits": "1", 
      "id": "2044" 
     } 
     ], 
     "lastTransactionID": "2046" 
    }; 

    for d in data['trades']: 
     print(d['openTime']) 

Das gibt:

2017-11-08T17:21:49.533679739Z 
2017-11-08T17:19:27.343697147Z 
0

rv.get("trades").get("financing") nicht funktioniert, weil trades Wert kein Wörterbuch, sondern ein Liste. Sie können die Art davon überprüfen, indem Sie type(rv.get('trades')) tun. So ist der richtige Weg

rv.get("trades")[0].get("financing") 
rv.get("trades")[1].get("financing") 

So müssen Sie über die Liste zu durchlaufen als

for item in rv.get('trades'): 
    print(item.get('financing')) 
0

Eine andere nette Alternative wäre Liste Verständnis verwenden, die für eine einzeilige Lösung ermöglicht:

[trade.get("financing") for trade in rv.get("trades")] 

Beachten Sie, dass dies nicht besser ist als @Bahr Antwort, nur mehr Pythonic meiner Meinung nach.

Verwandte Themen