2017-06-26 3 views
-1

Dies ist die erste Frage, die ich in diesem Forum stelle, daher freue ich mich über Ihr Feedback, um dies für andere hilfreicher zu machen.Eine Zeile bedingte Zuweisung if-Anweisung

Sagen, ich habe diese Liste:

IDs = ['First', 'Second', 'Third'] 

und dieses Wörterbuch:

statistics = {('First', 'Name'):"FirstName", ('Second','Name'):"SecondName", ('Third','Name'):"ThirdName"} 

Gibt es einen kürzeren, einfachen Einzeiler als die folgenden zu lesen?

firstID = IDs[[statistics[ID,'Name'] for ID in IDs].index('FirstName')] 

Vielen Dank

+1

@ Jean-FrançoisFabre: Sieht gut aus, solange Sie den Rest der Zeile lesen. Nicht sehr effizientes Design. – user2357112

+0

so unlesbar Ich dachte, dass es falsch war! –

+0

Gibt es einen besonderen Grund, warum Sie Ihr Diktat in diese Richtung bringen, anstatt die Schlüssel und Werte zu wechseln? Wenn Sie Nachschläge in beide Richtungen benötigen, haben Sie darüber nachgedacht, ein zweites, umgekehrtes Diktat zu machen? – user2357112

Antwort

2

Ein effizienter (und wahrscheinlich besser lesbar) Ansatz wäre dies:

firstID = next(id for id in IDs if statistics[(id,'Name')]=='FirstName') 

Dies definiert eine generator, die die IDs um prüft und ergibt Werte von statistics das gleich "FirstName". next(...) wird verwendet, um den ersten Wert von diesem Iterator abzurufen. Wenn kein übereinstimmender Name gefunden wird, wird StopIteration ausgelöst.

+0

Vielen Dank, das ist genau das, was ich gesucht habe! –

0
# If you ever plan to change the order of IDs: 
firstID = IDs[IDs.index('First')] 

# If you are literally just looking for the first ID in IDs: 
firstID = IDs[0] 

Wenn Sie in diesen beiden Zeilen an Code aussehen:

IDs = ['First', 'Second', 'Third'] 
firstID = IDs[[statistics[ID,'Name'] for ID in IDs].index('FirstName')] 

Der Index der 'FirstName' in die neu erstellte Liste wird immer gleich dem Index der 'First' in IDs. Da Ihr Listenverständnis IDs in der Reihenfolge iteriert und die entsprechenden dict Werte in dieser Reihenfolge eingibt, erstellen Sie immer mit dem gleichen Index wie 'First' erscheint in IDs. Daher ist es weitaus effizienter, sie einfach aus dieser Liste mit einer der oben genannten Methoden aufzurufen.

+0

Danke, aber ich suchte nach der ID ('First') eines Elements, indem ich einfach seinen Namen ('FirstName') benutzte. –

Verwandte Themen