[Python] Dictionary - Wähle Datensatz anhand value

#6974418
Lesenswert?

Ich habe hier einen Datensatz aus einer JSON in einem Python Dict:
1
{
2
    "relay": [
3
        {
4
            "id": 0,
5
            "name": "Licht",
6
            "typ": 1,
7
            "pin": 18,
8
            "over": 0,
9
            "state": 0
10
        },
11
        {
12
            "id": 1,
13
            "name": "none",
14
            "typ": 1,
15
            "pin": 23,
16
            "over": 0,
17
            "state": 0
18
        },
19
        {
20
            "id": 7,
21
            "name": "none",
22
            "typ": 1,
23
            "pin": 20,
24
            "over": 0,
25
            "state": 0
26
        }
27
    ]
28
}

Ich möchte aus dem Datensatz den Eintrag "pin" aus Relay mit dem Key 
"id":"7" anzeigen. Wie wähle ich explizit diesen Datensatz aus?
#6974435
Lesenswert?

Rene K. schrieb:
> Ich habe hier einen Datensatz aus einer JSON in einem Python Dict:
>
>
1
> {
2
>     "relay": [
3
[...]
4
>         {
5
>             "id": 7,
6
>             "name": "none",
7
>             "typ": 1,
8
>             "pin": 20,
9
>             "over": 0,
10
>             "state": 0
11
>         }
12
>     ]
13
> }
14
>
>
> Ich möchte aus dem Datensatz den Eintrag "pin" aus Relay mit dem Key
> "id":"7" anzeigen. Wie wähle ich explizit diesen Datensatz aus?
1
def search(data, key, value):
2
    for item in data:
3
        if item[key] == value:
4
            return item
5
    return None # oder Exception auslösen
Moderator #6974540
Lesenswert?

Etwas pythonischer als einzelner Ausdruck:
1
next(x for x in d['relay'] if x['id'] == 7)

Falls du das ändern kannst, wäre eine Datenstruktur ohne Array
geschickter:
1
{
2
    "relay": {
3
        0: {
4
            "name": "Licht",
5
            "typ": 1,
6
            "pin": 18,
7
            "over": 0,
8
            "state": 0
9
        },
10
        1: {
11
            "name": "none",
12
            "typ": 1,
13
            "pin": 23,
14
            "over": 0,
15
            "state": 0
16
        },
17
        7: {
18
            "name": "none",
19
            "typ": 1,
20
            "pin": 20,
21
            "over": 0,
22
            "state": 0
23
        }
24
    }
25
}

Dann entfällt die lineare Suche und du kannst einfach
1
d['relay'][7]

schreiben.
Gast #6974590
Lesenswert?

Dem Salz seine Denke gefällt mir: wollte ich doch auch auf /List 
Comprehension/ hinweisen.

Hingegen die Daten gem. 2. Vorschlag umzutopfen da stimme ich nur zu 
wenn es bei sonstigem Umgang mit diesen Daten in diesem Programm auch 
tatsächlich passt.

Die list comprehension zeigt den allgemeinen Weg und funktioniert mit 
jedem Eintrag des Dicts, nicht bloss mit "id" und nicht bloss mit ganzen 
Zahlen. (z.b. könnte "name"=="Licht" auch das Kriterium sein)

Numerische, ganzzahliger Index ist bei List ohnehin implizit mit 
dabei...
Gast #6974597
Lesenswert?

Ja, gegen den Preis der linearen Suche in Liste gibt es bessere 
Datenstrukturen. Gerne aber mit selbem Interface wie Liste, dann 
funktionieren generisch geschriebene Algorithmen weiterhin einfach so...

Bei unter tausend Einträge in der Liste würde ich mir noch lange keinen 
Kopf machen und die Mikrooptimierung zugunsten Flexibilität u. 
Erweiterbarkeit Links liegen lassen.

Das soll ja nich in MicroPython laufen, oder?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren