it-swarm.com.de

Python: Holen Sie sich ein Diktat aus einer Liste basierend auf etwas innerhalb des Diktats

Ich muss in der Lage sein, ein Element in einer list zu finden (ein Element, das in diesem Fall eine dict ist), basierend auf einem Wert innerhalb dieser dict. Die Struktur der list, die ich verarbeiten muss, sieht folgendermaßen aus:

[
    {
        'title': 'some value',
        'value': 123.4,
        'id': 'an id'
    },
    {
        'title': 'another title',
        'value': 567.8,
        'id': 'another id'
    },
    {
        'title': 'last title',
        'value': 901.2,
        'id': 'yet another id'
    }
]

Vorbehalte: title und value können einen beliebigen Wert (und denselben Wert) haben, id wäre eindeutig.

Ich muss in der Lage sein, eine dict von dieser list basierend auf einer eindeutigen id zu erhalten. Ich weiß, dass dies mit Hilfe von Schleifen gemacht werden kann, aber dies scheint umständlich zu sein, und ich habe das Gefühl, dass es eine naheliegende Methode gibt, die ich dank Gehirnschmelze nicht sehe.

37
johneth
my_item = next((item for item in my_list if item['id'] == my_unique_id), None)

Dadurch wird die Liste durchlaufen, bis der erste Artikel gefunden wird, der mit my_unique_id übereinstimmt, und dann angehalten. Es speichert keine Zwischenlisten im Speicher (mithilfe eines Generatorausdrucks) und erfordert keine explizite Schleife. Es setzt my_item auf None, wenn kein Objekt gefunden wird. Es ist ungefähr das Gleiche wie

for item in my_list:
    if item['id'] == my_unique_id:
        my_item = item
        break
else:
    my_item = None

else-Klauseln in for-Schleifen werden verwendet, wenn die Schleife nicht durch eine break-Anweisung beendet wird.

68
agf

Wenn Sie dies mehrmals durchführen müssen, sollten Sie ein nach id indexiertes Wörterbuch in Ihrer Liste erstellen: 

keys = [item['id'] for item in initial_list]
new_dict = dict(Zip(keys, initial_list)) 

>>>{
    'yet another id': {'id': 'yet another id', 'value': 901.20000000000005, 'title': 'last title'}, 
    'an id': {'id': 'an id', 'value': 123.40000000000001, 'title': 'some value'}, 
    'another id': {'id': 'another id', 'value': 567.79999999999995, 'title': 'another title'}
}

oder auf einer Art und Weise, wie von agf vorgeschlagen: 

new_dict = dict((item['id'], item) for item in initial_list)
17
Cédric Julien

Arbeitete nur mit iter() für mich:

my_item = next(iter(item for item in my_list if item['id'] == my_unique_id), None)
1

Sie können zu diesem Zweck eine einfache Funktion erstellen:

lVals = [{'title': 'some value', 'value': 123.4,'id': 'an id'},
 {'title': 'another title', 'value': 567.8,'id': 'another id'},
 {'title': 'last title', 'value': 901.2, 'id': 'yet another id'}]

def get_by_id(vals, expId): return next(x for x in vals if x['id'] == expId)

get_by_id(lVals, 'an id')
>>> {'value': 123.4, 'title': 'some value', 'id': 'an id'}
0
In [2]: test_list
Out[2]: 
[{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001},
 {'id': 'another id', 'title': 'another title', 'value': 567.79999999999995},
 {'id': 'yet another id', 'title': 'last title', 'value': 901.20000000000005}]

In [3]: [d for d in test_list if d["id"] == "an id"]
Out[3]: [{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001}]

Listenverständnis verwenden

0
TyrantWave

Nur für den Fall, dass Sie eine Suche anhand des Schlüssels eines Wörterbuchs durchführen möchten.

my_item = next((item for item in my_list if item.has_key(my_unique_key)), None)

0
Kevin Amipara