2012-11-10 50 views
-3

可能重複:
function in function功能輸出

我怎麼可以讓FUNC。顯示所有不良的價值觀,而不僅僅是一個?

def get_bad_results(person_results): 
     for i in person_results: 
       if i[1]>i[3] or i[1]<i[2]: 
        return i[0] 

test_results = [["White blood cells",8.5,2,7], 
       ["Neutrophils",5.3,2.5,5], 
       ["Red blood cells", 12.4, 9,15]] 

a = get_bad_results(test_results) 
print a 

顯示White blood cells

,而不是

White blood cells, Neutrophils 
+3

http://stackoverflow.com/q/13308553/989121。請不要加倍張貼。保持這個地方乾淨。 – georg

回答

2

該函數會返回一個適合的聲明中第一次出現。要返回全部,可以將它們保存在列表中,並在循環完成時返回列表。

for i in person_results: 
    bads = [] 
    if i[1]>i[3] or i[1]<i[2]: 
     bads.append(i[0]) 
return bads 
+0

這不是一個很好的做法。首先,與生成器相比,構建列表的內存效率並不高,並且如果要構建列表,則可以使用[列表理解](http://www.youtube.com/watch?v=pShL9DCSIUw)會是在這裏做得更好的方法。 –

+0

@Lattyware:我同意,但我選擇了最簡單的方法解決問題,但這不是最有效的方法。在我看來,你的答案對這個問題是最好的。 – Maehler

1

如果你不想使用生成器,您可以將壞分子到一個列表,然後返回它:

def get_bad_results(person_results): 
    bad_results = [] 
    for i in person_results: 
     if i[1] > i[3] or i[1] < i[2]: 
      bad_results.append(i[0]) 
    return bad_results 

或使用列表理解:

def get_bad_results(person_results): 
    return [i[0] for i in person_results if i[1] > i[3] or i[1] < i[2]] 
0

爲什麼不直接從已經在做比較的函數中打印呢?然後,你不需要任何額外的跟蹤

def get_bad_results(person_results): 
     for i in person_results: 
       if i[1]>i[3] or i[1]<i[2]: 
        print i[0] 
4

您正在尋找yield關鍵字,其產生的發電機:

def get_bad_results(person_results): 
     for i in person_results: 
       if i[1]>i[3] or i[1]<i[2]: 
        yield i[0] 

然後,您可以遍歷函數的結果(例如,呼叫list()創建一個列表)。生成器最好直接生成列表,因爲它意味着這些值是懶惰地生成的,這在很多情況下更具有內存效率。

作爲一個側面說明,索引i有點醜,在這種情況下,拆包值將使你的代碼更易讀:

def get_bad_results(person_results): 
     for name, age, height, weight in person_results: 
       if age > weight or age < height: 
        yield name 

(當然,我在這裏做了名字,因爲我不要不瞭解上下文)。