Forum: PC-Programmierung [Python] Dictionary - Wähle Datensatz anhand value


von Rene K. (xdraconix)


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?

von Ein T. (ein_typ)


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

von Yalu X. (yalu) (Moderator)


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.

von Programmiersprachentheaterintendant (Gast)


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...

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

pffff... Yalu - nicht Salz (autoknorzrecktor FTW...)

von Programmiersprachentheaterintendant (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.