[Python] Dictionary - Wähle Datensatz anhand value

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.