2017-06-26 8 views
-1

Ich möchte etwas von der Form tun:mit Python enumerate() gleichzusetzen Listenelemente

for index,value in enumerate('xyz'): 
    [x,y,z][index] = [dict1.get(value),dict2.get(value),dict3.get(value)][index] 

Aber natürlich funktioniert das nicht.

Ich möchte eine Eingabezeichenfolge verwenden und jedes Zeichen einem Wörterbuch zuordnen und dann den entsprechenden Wörterbuchwert einer Variablen zuweisen. Betrachten Sie die folgende Funktion:

def parse_options(options): 
    dir_pref,file_pref,name_pref = None,None,None 
    for idx,char in enumerate(options): 
     # match key characters from input 'options' string to dictionaries 
     if char in [dir_options.keys(),file_options.keys(),name_options.keys()][idx]: 
      [dir_pref,file_pref,name_pref][idx] = \ 
      [dir_options.get(char),file_options.get(char),name_options.get(char)][idx] 
    return [dir_pref,file_pref,name_pref] 

Which, derzeit gibt (None,None,None)

Dies ist eine Umbenennung Skript. options ist ein Zeichenfolgenobjekt, bei dem das erste Zeichen der Zeichenfolge meinem Skript mitteilt, wie es über Verzeichnisse iterieren soll; das zweite Zeichen teilt meinem Skript mit, wie es wählen soll, auf welchen Dateien es laufen soll; und das dritte Zeichen teilt meinem Skript mit, wie es die Dateien umbenennen sollte. Ich möchte in options auf ein entsprechendes Wörterbuch jedes der Zeichen übereinstimmen (dir_options, file_options und name_options, respectively) und ihre entsprechenden Wörterbuch Werte zu drei neue Variablen zuweisen (dir_pref, file_pref und name_pref)

Es kann sein, dass es eine viel bessere Möglichkeit, das zu tun, in diesem Fall würde ich gerne Vorschläge hören

+0

Soweit ich weiß, können Sie mit * iterable entpacken * keinen zusätzlichen Index ** angeben. –

+2

Ich weiß nicht ob es nur ich ist, aber ich verstehe das überhaupt nicht. Ich habe keine Ahnung, was versucht werden soll und was das endgültige erwartete Ergebnis sein soll. – idjaw

+0

Ich denke, was Sie auf lange Sicht zu tun versuchen, kann viel besser als das, was Sie versuchen, getan werden – TerryA

Antwort

2

Sie können nicht auswählen, welche Variable zuzuweisen, indem Sie eine Liste indizieren. Zuweisen zu [x, y, z][1] wird nicht zugewiesen zu y; Es weist eine Listenzelle in einer Liste zu, die einfach weggeworfen wird.

Statt alles, was Sie tun, stopfen, loszuwerden, die meisten dieser Variablen und nur die zurückgegebene Liste bauen direkt:

def parse_options(options): 
    return [d.get(char) 
      for d, char in zip([dir_options, file_options, name_options], options)] 

Die dir_pref, file_pref und name_pref Variablen sind völlig unnötig. Außerdem gibt getNone standardmäßig zurück, wenn der Schlüssel nicht vorhanden ist, so dass Sie keine explizite Überprüfung benötigen.

+0

Sehr schöne Lösung! Danke, dass Sie die unnötige Komplexität durchbrochen haben. – corvus

+0

Können Sie mit dieser Methode eine Methode vorschlagen, mit 'KeyError' umzugehen? (Wenn ein Schlüssel nicht im Wörterbuch gefunden wurde, würde ich gerne das Schlüsselzeichen selbst als Zeichenfolge übergeben) – corvus

+0

@corvus: 'dict.get' nimmt ein optionales zweites Argument, das angibt, was zurückgegeben werden soll, wenn der Schlüssel nicht vorhanden ist, wenn der Standardwert 'None' nicht der von Ihnen gewünschten ist. – user2357112