2017-08-05 1 views
0

Ich versuche, den Benutzer eine ID-Nummer eingeben, die der ersten Liste entspricht, und ziehen Sie dann den Index-übereinstimmenden Namen und Pay-Rate aus den folgenden 2 Listen. Die Mitarbeiter-ID wird jedoch nicht in der Liste gefunden. Ich habe eine Reihe von verschiedenen Loops ausprobiert, aber es ist entweder komplett aus, lassen Sie uns eine einzelne Zahl wie "0" gibt zurück, oder funktioniert wie es jetzt tut - gut, aber nicht mit der ersten Liste.Speichern von Daten in 3 separaten Listen und parallelem Zugriff

Dies ist für eine Klassenzuweisung, aber ich kann keine Beispiele in der Klasse oder online finden, die ähnlich sind, was ich versuche zu tun. Ich habe im Abschnitt employee_id_prompt eine Reihe verschiedener Schleifen ausprobiert, aber ich kann es nicht zum Laufen bringen.

Kann jemand eine Anleitung geben, wie ich die Eingabe der ersten Liste zuordnen kann und die übereinstimmenden Werte aus der zweiten und dritten Liste zurückgeben kann? Ich habe eine Menge von "für in Mitarbeiter_id gefunden", "ob Eingabe_employee_id in Mitarbeiter_ID", etc., aber ich finde immer wieder Fehler, die ich nicht herausfinden kann.

SIZE = 10 
employee_id = [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010] 
employee_name = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] 
employee_pay = [17.75, 18.23, 19.42, 20.00, 21.50, 22.34, 23.74, 24.68, 24.75, 25.00] 

def check_int(prompt): 
    int_result = 0 

    while True: 
     try: 
      int_result = int(input(prompt)) 
     except ValueError: 
      print("This is outside the range or invalid. Please enter again.") 
      continue 
     else: 
      break 
    return int_result 


def employee_id_prompt(): 
    input_employee_id = 0 
    found = False 
    index = 0 

    while True: 
     input_employee_id = check_int("Please enter your Employee ID number: ") 
     while found == False and index <= SIZE - 1: 
      if employee_id[index] == input_employee_id: 
       found = True 
      else: 
       index = index + 1 

     if found == True: 
      print("Welcome " + employee_name[index] + ". Your current pay rate is $", + employee_pay[index], 
       "an hour.") 
      break 
     else: 
      print("I'm sorry, that Employee ID number is not recognized.") 
      index = index + 1 


employee_id_prompt() 
+0

Dies ist eigentlich keine gute Möglichkeit, Daten in drei Listen zu strukturieren. In diesem Fall sollten Sie eine Art von Datensatz verwenden (Objekt, Tupel, NamedTuple usw.). –

+0

Sie können [die beste Antwort auf Ihre Frage] (https://stackoverflow.com/help/someone-answers) als akzeptiert markieren. Es hilft der Gemeinschaft. –

Antwort

0

Das Update

Verwenden list.index für einen Index zu suchen. Wenn ein Element nicht existiert, wird eine ValueError ausgelöst, die Sie fangen können.

ix = None 
try: 
    ix = employee_id.index(input_employee_id) 
except ValueError: 
    pass 

if ix != None: 
    name = employee_name[ix] 
    pay = employee_pay[ix] 

Die Verbesserung

Verwenden Sie ein Wörterbuch um Ihre Daten zu speichern. Verwenden Sie employeeId als Schlüssel und ein Tupel von Namen, zahlen als den Wert, so müssten Sie so etwas wie:

{ id1 : (name1, pay1), ... } 

Zum Beispiel mit collections.defaultdict (import collections zuerst):

In [537]: data = collections.defaultdict(lambda: None) 

In [538]: for id, name, pay in zip(employee_id, employee_name, employee_pay): 
    ...:  data[id] = (name, pay) 
    ...:  

In [539]: data 
Out[539]: 
defaultdict(<function __main__.<lambda>>, 
      {1001: ('A', 17.75), 
      1002: ('B', 18.23), 
      1003: ('C', 19.42), 
      1004: ('D', 20.0), 
      1005: ('E', 21.5), 
      1006: ('F', 22.34), 
      1007: ('G', 23.74), 
      1008: ('H', 24.68), 
      1009: ('I', 24.75), 
      1010: ('J', 25.0)}) 

Jetzt Ihre Daten bekommen ist einfach:

In [543]: print(data[1001]) 
('A', 17.75) 

In [544]: print(data[1234567]) 
None 

None zurückgegeben, wenn die id existiert nicht. Dies ist ein Merkmal der collections.defaultdict.

Alternativ ist eine collections.namedtuple Struktur eine nützliche Struktur hier, aber Sie opfern auf konstante Suche auf id, weil Sie eine Liste der benannten Tupel benötigen.

0

Es scheint, dass found und index muss im while True Schleife

while True: 
    found = False 
    index = 0 
    input_employee_id = check_int("Please enter your Employee ID number: ") 
    while index <= SIZE - 1: 
     if employee_id[index] == input_employee_id: 
      found = True 
      break 
     else: 
      index = index + 1 

Mit etwas mehr Erfahrung mit Python initialisiert werden, werden Sie list.index() bevorzugen die Liste zu suchen, wie Coldspeed sagt.

+0

Danke! Das hat funktioniert. Ich sehe in meinem Klassenbeispiel, dass die beiden innerhalb der True-Anweisung initialisiert wurden, aber es wurde nicht erklärt. – Kethi

+0

Der Grund dafür ist, dass jedes Mal, wenn Sie 'input_employee_id = check_int (...) 'ausführen, eine neue Mitarbeiter-ID verarbeitet wird und die Suche neu gestartet werden muss. – Gribouillis

+0

@Kethi Wenn es bessere Möglichkeiten gibt, das gleiche zu tun, was du machst, warum denkst du nicht daran, sie zu benutzen? –

Verwandte Themen