[Python] Uitlezen dictionary met meerdere values per key.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • GenetiX
  • Registratie: November 2000
  • Laatst online: 21-03 14:36
Via JSON.loads heb ik een extract gemaakt van een API JSON URL. Gegevens worden weggeschreven in een dictionary. Dictionary Key 'bied' bevat een valuereeks van verschillende koersen.

Dit is de inhoud van de dictionary (ingekort, want key 'bied' bevat meer items, dus meer items tussen [])

Inhoud dictionary:
code:
1
[(u'result', {u'EURUSD': {u'bied': [[u'120000.10000', u'1.2', 9384932], [u'120000.00000', u'1.1', 938493]]}}), (u'error', [])]


Gezien een dictionary niet met pointers werkt is het lastig om de koersen bijvoorbeeld per regel in list of tupel te zetten.

Iemand suggesties hoe ik op een makkelijke en snelle manier het aantal items tussen [ ] kan tellen en in een list of tupel kan plaatsen. Simpele conversie van dictionary naar list/tupel werkt niet. Er worden dan slechts twee pointers aangemaakt, waar de hele string in wordt geplaatst.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 10-10 14:20
Het is me niet helmaal duidelijk wat je wilt, maar dit?:
(waarbij 'a' jouw lijstje is)

Python:
1
2
>>> print len( a[0][1]['EURUSD']['bied'] )
2

Python:
1
2
3
>>> x = a[0][1]['EURUSD']['bied']
>>> print x
[[u'120000.10000', u'1.2', 9384932], [u'120000.00000', u'1.1', 938493]]

Acties:
  • 0 Henk 'm!

  • GenetiX
  • Registratie: November 2000
  • Laatst online: 21-03 14:36
beetle71 schreef op donderdag 17 april 2014 @ 21:28:
Het is me niet helmaal duidelijk wat je wilt, maar dit?:
(waarbij 'a' jouw lijstje is)

Python:
1
2
>>> print len( a[0][1]['EURUSD']['bied'] )
2

Python:
1
2
3
>>> x = a[0][1]['EURUSD']['bied']
>>> print x
[[u'120000.10000', u'1.2', 9384932], [u'120000.00000', u'1.1', 938493]]
Dit lukt me wel. Ik wil de values tussen de [ ] per regel in een list zetten voor verdere bewerking.

List inhoud moet worden:

[0] : '12000.10000', '1.2', '9384932'
[1] '120000.00000','1.1', '938493'

etc. etc.

Volgens mij gaat het meer om het uitkleden van deze string om vervolgens op te knippen en in de list te zetten:

[[u'120000.10000', u'1.2', 9384932], [u'120000.00000', u'1.1', 938493]]

Acties:
  • 0 Henk 'm!

  • Zeebonk
  • Registratie: Augustus 2005
  • Laatst online: 30-07 20:50
De functie json.loads returned een datastructuur die de complete data omvat. Het is niet één dictionairy, maar een boom van dictionaries, lists, strings en numbers.

In het voorbeeld van beetle71 is de variabele x precies dat wat je wilt hebben:

Python:
1
2
3
4
5
6
7
8
9
10
>>> print x[0] 
[u'120000.10000', u'1.2', 9384932]
>>> print x[1]
[u'120000.00000', u'1.1', 938493]
>>> print x[1][0]
120000.00000
>>> print x[1][1]
1.1
>>> print x[1][2]
938493


Uit je berichten lijkt het er op dat je nog niet een goed idee hebt wat json.loads precies returned en in combinatie met de print output op het verkeerde been word gezet. Python heeft literal notaties voor lists en dictionaries, respectievelijk [] en {}.

Python:
1
2
3
4
5
6
7
8
# Gewone list
a = list(1, 2, 3, 4) 
b = [1, 2, 3, 4]
a == b  # True

# List van lists (net als variabele x van beetle71)
c = list(list(1,2,3,4), list(5,6,7,8), list(8, 9, 10, 11))
c = [[1,2,3,4], [5,6,7,8], [8, 9, 10, 11]]


Bij prints van lists en dictionaries word altijd de litaral notatie gebruikt in plaats van de list() en dict() functies.

Acties:
  • 0 Henk 'm!

  • GenetiX
  • Registratie: November 2000
  • Laatst online: 21-03 14:36
Verhelderend Zeebonk, waar het gaat om de opbouw van JSON.loads. Ik begreep inderdaad niet goed hoe de return hiervan was opgebouwd.

De uiteindelijke code om de individuele items te benaderen, hier in print voorbeeld:

code:
1
print a([ result']['EURUSD']['bied'][0][1])


Resultaat: 1.2

Acties:
  • 0 Henk 'm!

  • DXaroth
  • Registratie: Maart 2011
  • Laatst online: 24-08 19:58
GenetiX schreef op donderdag 17 april 2014 @ 14:20:
Via JSON.loads heb ik een extract gemaakt van een API JSON URL. Gegevens worden weggeschreven in een dictionary. Dictionary Key 'bied' bevat een valuereeks van verschillende koersen.

Dit is de inhoud van de dictionary (ingekort, want key 'bied' bevat meer items, dus meer items tussen [])

Inhoud dictionary:
code:
1
[(u'result', {u'EURUSD': {u'bied': [[u'120000.10000', u'1.2', 9384932], [u'120000.00000', u'1.1', 938493]]}}), (u'error', [])]


Gezien een dictionary niet met pointers werkt is het lastig om de koersen bijvoorbeeld per regel in list of tupel te zetten.

Iemand suggesties hoe ik op een makkelijke en snelle manier het aantal items tussen [ ] kan tellen en in een list of tupel kan plaatsen. Simpele conversie van dictionary naar list/tupel werkt niet. Er worden dan slechts twee pointers aangemaakt, waar de hele string in wordt geplaatst.
dict(waarde) zal van het eerste gedeelte een nette dict maken, als volgt:

Python:
1
2
3
4
{
    u'result': {u'EURUSD': {u'bied': [[u'120000.10000', u'1.2', 9384932], [u'120000.00000', u'1.1', 938493]] } },
    u'error': []
}


Dan wordt het wat makkelijker om er mee te werken:

Python:
1
2
3
4
5
6
7
8
9
10
11
>>> bied = data['result']['EURUSD']['bied']
>>> bied[0]
[u'120000.10000', u'1.2', 9384932]
>>> bied[1]
[u'120000.00000', u'1.1', 938493]
>>> len(bied)
2
>>> len(bied[0])
3
>>> sum([ len(x) for x in bied ])
6
Pagina: 1