2013-05-15 136 views
0

我有一個類似下面的函數。我想要做的是讓我說我​​有checklist('sky high'),那麼輸出的產品將是30,19而不是0,30,0,19就像我現在的代碼所做的那樣。如果我有checklist('blue sky'),則產量將爲0。那麼我該如何改變我的代碼呢?如果語句混淆

def checklist(argument): 

    data = [["sky",'79'], 
      ["sky high",'30'], 
      ["sky sky",'50'], 
      ["sky high",'19']] 

    for row in data: 
     if argument == row[0]: 
      print row[1] 

     else: 
      print 0 

回答

0

爲什麼不保持在一個情況下沒有boolean行匹配你的輸入,並檢查boolean在結束了嗎?這將避免打印這麼多的0。

3
def checklist(argument): 
    data = [["sky",'79'], 
      ["sky high",'30'], 
      ["sky sky",'50'], 
      ["sky high",'19']] 
    #create the list first 
    ans = [x[1] for x in data if x[0]==argument] 
    #If the list has 0 items then return 0 else return the str.join() version of list 
    return ", ".join(ans) if ans else 0 

print checklist('sky high') 
print checklist('blue sky') 

輸出:

30, 19 
0 
0

你得到額外的0行,因爲你print 0每次循環內的項目不匹配。爲了避免這種情況並使代碼更清晰,我會使用稍微不同的數據結構(字典而不是列表列表)。事情是這樣的:

def checklist(argument): 
    data = { 
      "sky":['79'], 
      "sky high":['30', '19'], 
      "sky sky":['50'] 
      } 
    results = data.get(argument) 
    if results is None: 
     print 0 
    else: 
     print('\n'.join(results)) 

checklist('sblue sky') # prints 0 
checklist('sky high') # prints 30\n19 
0

else語句導致循環打印0如果當前元素不是argument,這恰好不少。

你要麼必須做一個單獨的列表,並檢查循環之外:

results = [] 

for row in data: 
    if argument == row[0]: 
     results.append(row[1]) 

if results: 
    print ','.join(results) 
else: 
    print 0 

或作出解釋你的元素:

data_dict = {} 

for key, value in data: 
    if key in data_dict: 
     data_dict[key].append(value) 
    else: 
     data_dict[key] = [value] 

現在,你可以這樣做:

key = 'sky high' 

if key in data_dict: 
    print ','.join(data_dict[key]) 
else: 
    print 0 

或者更簡潔:

print ','.join(data_dict.get(key, ['0'])) 
0

這聽起來像你不想要發生任何事情,如果argument不等於row[0],所以只是擺脫else語句。沒有必要指定else

def checklist(argument): 

    data = [["sky",'79'], 
      ["sky high",'30'], 
      ["sky sky",'50'], 
      ["sky high",'19']] 

    for row in data: 
     if argument == row[0]: 
      print row[1] 

我誤解了......現在我看到,如果沒有匹配,你想要零。你可以嘗試這樣的事情

def checklist(argument): 

    data = [["sky",'79'], 
      ["sky high",'30'], 
      ["sky sky",'50'], 
      ["sky high",'19']] 
    result = '' 
    for row in data: 
     if argument == row[0]: 
      result += row[0]+',' 
    if result: 
     print result[:-1] # This slice leaves off the last ',' 
    else: 
     print '0' 

請注意,這將格式化事情有點不同於我的第一個答案。