2017-07-19 98 views
0

從一個名爲元組的列表中的條目我有namedtuples一個list如下的Python:如果包含特定屬性值

fruits = Fruits['type', 'color', 'weight', 'sweetness'] 
f1 = fruits('apple', 'red', 1.89, 5) 
f1 = fruits('pear', 'green', 2.89, 7) 
f1 = fruits('banana', 'yellow', 2.01, 10) 

l = [f1, f2, f3] 

現在,我想有從列表中返回一個特定namedtuple功能給出type。我使用for循環編寫了這個函數,但它可以做得更好(更快還是沒有for循環)?

def take_fruit(type, all_fruits): 
    for f in all_fruits: 
     if f.type == type: 
      return f 
    return None 
+1

'next((f for all_fruits if for f.type == type),None)'但不知道它是否更快。 –

+1

有幾種方法可以做到這一點,但我認爲沒有比您的變體更快的方法。 如果你想擺脫循環,你可以使用'過濾器'或列表理解。 – Zinki

回答

1

您可以使用filter或列表解析,使代碼,雖然不一定更快

def take_fruit_listcomp(type, all_fruits): 
    try: 
     return [f for f in all_fruits if f.type == type][0] 
    except IndexError: 
     return None 

def take_fruit_filter(type, all_fruits): 
    try: 
     # no need for list(..) if you use Python 2 
     return list(filter(lambda f: f.type == type, all_fruits))[0] 
    except IndexError: 
     return None 
0

您可以使用此方法僅如果沒有重複的類型。你可以爲此使用字典。

d = { 
"apple" : fruits('apple', 'red', 1.89, 5), 
"pear" : fruits('pear', 'green', 2.89, 7), 
"banana" : fruits('banana', 'yellow', 2.01, 10) 
} 

def take_fruit(type) 
    return list(d[type]) 

這裏,字典存儲類型作爲關鍵字。這種方式更快

+0

如果有2個蘋果怎麼辦? – DeepSpace

+0

在答案的開頭添加了一個約束 – bigbounty

相關問題