2017-08-05 53 views
0

我試圖讓用戶輸入一個與第一個列表匹配的ID號,然後從以下2個列表中提取索引匹配名稱和支付率。但是,它沒有在列表中找到員工ID。我試過了一堆不同的循環,但它要麼完全錯誤,讓我們像「0」返回值的單個數字,或像現在這樣工作 - 很好,但不匹配第一個列表。將數據存儲在3個單獨的列表和並行訪問中

這是爲了一個類的任務,但我找不到任何類或在線類似於我想要做的例子。我在employee_id_prompt部分嘗試了一堆不同的循環,但是我無法使其工作。

有人可以提供一些指導,如何讓它匹配到第一個列表的輸入,並返回第二個和第三個列表中的匹配值?我嘗試了一堆「在employee_id中找到」,「如果employee_id中的input_employee_id」等,但我仍然發現我找不到的錯誤。

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

這實際上不是一個很好的方式來構建數據,在三個列表中。在這種情況下,您應該使用某種記錄(對象,元組,名稱等)。 –

+0

您可以[標記您的問題的最佳答案](https://stackoverflow.com/help/someone-answers)爲已接受。它有助於社區。 –

回答

0

的修復

使用list.index搜索的索引。如果一個物品不存在,則會引發一個ValueError,您可以抓住它。

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

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

改善

使用字典來存儲你的數據。使用employeeId爲重點,和名稱的元組,現收現付的價值,所以你必須是這樣的:

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

例如,使用collections.defaultdictimport collections在前):

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)}) 

現在,讓你的數據是很容易:

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

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

None如果id不存在,則返回。這是collections.defaultdict的一項功能。

或者,collections.namedtuple結構在這裏是一個有用的結構,但是您在id上不斷查找會犧牲,因爲您需要一個命名元組列表。

0

似乎foundindex必須while True

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 

與Python的一點經驗裏面進行初始化,你會更喜歡list.index()搜索列表,Coldspeed說。

+0

謝謝!這工作。我在我的例子中看到,兩個都是在True語句中初始化的,但沒有解釋。 – Kethi

+0

原因是,每次運行'input_employee_id = check_int(...)'時,都會處理新的員工ID,並且搜索必須從新重新開始。 – Gribouillis

+0

@Kethi當有更好的方法來做同樣的事情時,爲什麼不考慮使用它們? –

相關問題