[Python] dicts combineren op basis van waarde

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Stefanovic45
  • Registratie: Juni 2008
  • Laatst online: 05-10 21:03
Ik heb meerdere dicts die ik graag wil combineren tot 1 dictionary.

Dict 1
code:
1
2
3
4
5
6
7
8
9
10
11
12
{
            "policyname": "Policy naam 1", 
            "hits": "0", 
            "priority": "100"

        }, 
        {
            "policyname": "Policy naam 2", 
            "hits": "0", 
            "priority": "110"

        }


Dict 2

code:
1
2
3
4
5
{
            "policyname": "Policy naam 1", 
            "url": "www.tweakers.net"

        }


Dict3


code:
1
2
3
4
5
{
            "policyname": "Policy naam 2", 
            "url": "www.tweakers2.net"

        }


Het is me gelukt om dit te doen met een for loop, maar ik krijg het niet voor elkaar om door alle data heen te lopen. Daarnaast die ik het op basis van de hoeveelste entry en er wordt dus niet daadwerkelijk gechecked of de policynamen gelijk zijn.

Ik ben ook niet de meest ervaren python programmeur, maar voor een beetje automatiseren is het toch wel handig. Is er iemand die mij op weg kan helpen? Ik doe het nu met 2 nieuwe waardes, maar dit kunnen er in het echt 10-tallen zijn.

Mijn uiteindelijke doel is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
            "policyname": "Policy naam 1", 
            "hits": "0", 
            "priority": "100",
            "url": www.tweakers.net

        }, 
        {
            "policyname": "Policy naam 2", 
            "hits": "0", 
            "priority": "110",
            "url": www.tweakers2.net

        }

Tesla Model Y RWD / 8.4 kWp PV installatie / WPB / lucht/lucht WP

Alle reacties


Acties:
  • 0 Henk 'm!

Verwijderd

Wat is de code die je tot nu toe hebt? Beetje lastig om je op weg te helpen met je oplossing.

Acties:
  • 0 Henk 'm!

  • smekkos
  • Registratie: Februari 2013
  • Laatst online: 02-10 07:09
zoieso heb je nu meerdere dicts gemaakt. Je wil denk ik meer een nested dict?
zoiets als

code:
1
2
3
4
5
6
7
8
9
10
11
dict = 
    {"policyname" : {
        "hits": "0",
        "priority": "100" ,
        "url": "www.tweakers.net"},
    "policyname2" : {
        "hits": "0",
        "priority": "10" ,
        "url": "www.tweakers2.net"}

}


Je kan dan gemakkelijk vergelijken en itereren.

code:
1
2
3
for key, value in dict1.items():
    if key not in dict:
        blablabla

Acties:
  • +3 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 11:06
Je kan ook naar pandas kijken. Als je een lijstje met dicts hebt, kun je die heel eenvoudig in een data frame omtoveren.

Als je twee types dicts hebt, maak je voor elk type een data frame. Daarna kun je ze heel makkelijk joined op de gezamenlijke key (policy_name).

Zeker als je een groot aantal dicts hebt, is pandas veel sneller dan pure Python.


Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import pandas as pd

# List of dict of type 1
dict_type1 = [
    {
            "policyname": "Policy naam 1", 
            "hits": "0", 
            "priority": "100"

        }, 
        {
            "policyname": "Policy naam 2", 
            "hits": "0", 
            "priority": "110"

        }
]

# List of dicts of type 2
dict_type2 = [
    {
        "policyname": "Policy naam 1", 
        "url": "www.tweakers.net"
    },
    {
        "policyname": "Policy naam 2", 
        "url": "www.tweakers2.net"
    }
]

# Create data frames
df1 = pd.DataFrame(dict_type1)
df2 = pd.DataFrame(dict_type2)

# Mergen maar...
df1.merge(df2, on='policyname')


Resulterend data frame:
hitspolicynamepriorityurl
0Policy naam 1100www.tweakers.net
0Policy naam 2110www.tweakers2.net


Data frame kan je simpel naar file schrijven (met .to_csv) of eventueel weer converteren naar dicts (maar wil je dat wel)...

[ Voor 72% gewijzigd door Morrar op 18-07-2018 23:26 ]


Acties:
  • 0 Henk 'm!

  • Stefanovic45
  • Registratie: Juni 2008
  • Laatst online: 05-10 21:03
Tnx voor de reacties :)
smekkos schreef op woensdag 18 juli 2018 @ 10:45:
zoieso heb je nu meerdere dicts gemaakt. Je wil denk ik meer een nested dict?
zoiets als

code:
1
2
3
4
5
6
7
8
9
10
11
dict = 
    {"policyname" : {
        "hits": "0",
        "priority": "100" ,
        "url": "www.tweakers.net"},
    "policyname2" : {
        "hits": "0",
        "priority": "10" ,
        "url": "www.tweakers2.net"}

}


Je kan dan gemakkelijk vergelijken en itereren.

code:
1
2
3
for key, value in dict1.items():
    if key not in dict:
        blablabla
Het is idd een nested dict, dus dat klopt. De dicts die ik wil toevoegen zijn echter wel losse dicts. Ik krijg ze zo terug van een API die ik aanroep.

Het is me overigens al wel gelukt om ze samen te voegen. Officieel zijn dicts natuurlijk ongesorteerd, maar omdat ik altijd dezelfde waardes terug krijg van een API blijkt deze oplossing wel te werken.

Ik heb de code wel enigszins herschreven:

code:
1
2
3
4
5
6
7
8
9
10
11
        i = 0
        # Loop door de nested dict 
        for policys in policy['policy']:
                policyname = policys['policyname']
                # nieuwe dicts ophalen
                url = api call op basis van policyname # geeft 1 dict terug
                request = requests.get(url, verify=False, cookies=cookie)
                cspolicy = json.loads(request.text)
                cspolicy_url = cspolicy['cspolicy'][0]['url'])
                policy['policy'][i]['url'] = cspolicy_url
                i += 1


Pandas en itertools zijn echter ook handige toevoegingen!

Tesla Model Y RWD / 8.4 kWp PV installatie / WPB / lucht/lucht WP


Acties:
  • 0 Henk 'm!

  • MartenBE
  • Registratie: December 2012
  • Laatst online: 10-09 18:09
StefanvanGelder schreef op maandag 23 juli 2018 @ 09:35:
[...]

Ik heb de code wel enigszins herschreven:

code:
1
2
3
4
5
6
        i = 0
        # Loop door de nested dict 
        for policys in policy['policy']:
                policyname = policys['policyname']
                # ...
                i += 1
Kleine tip: bovenstaande construct kan je mooi vervangen met een enumerate:

code:
1
2
3
4
        # Loop door de nested dict 
        for i, policys in enumerate(policy['policy']):
                policyname = policys['policyname']
                # ...

Acties:
  • +1 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Nu online
Of gewoon zonder die i
Python:
1
policys['url'] = cspolicy_url
Pagina: 1