2016-11-13 47 views
2

這個功能是通過詞典(數據庫)應該循環:增加汽車品牌車型年全國字典

{ data_base = { 
"Mercedes": [("E-class", 1970, "classic" , "Germany"),("Clk",  2000, "sport" , "Poland")] 
"Fiat": [("Uno" , 1980, "coupe" , "Italy")] 
"Jaguar" : [("S-type", 2000, "classic", "England"),("X-type", 2005,"luxury", "England")] } 

函數接受一個數據庫(上面的例子),更新所有其他的信息給它。如果一輛汽車已經在其中並且所有屬性匹配,則不會重複。另外,按照汽車模型對Asciibetically進行分類。功能只更新,沒有退貨。

functionX (data_base,make,model,year,style,country): 
    for key,value in data_base.items(): 
     if key == make and value[0] != model: # condition to ensure update is not duplicate 
      database[key].extend((model,year,style,country)): 
+0

我如何處理asciibetical命令? – Wanderer

+0

'sorted(list)'? – furas

+0

好的,謝謝。關於代碼的任何建議? – Wanderer

回答

1

當過data_base.items()循環,value是不是你認爲它是。它是與汽車製造相關的模型列表。例如。 [("Uno" , 1980, "coupe" , "Italy")]爲鑰匙'Fiat'。因此,對於重複的模型檢查時,您需要遍歷該列表,以確保模型中沒有找到:

def functionX (data_base,make,model,year,style,country): 
    for key, value in data_base.items(): 
     # first find all the models associated with the make 
     present_models = set(data[0] for data in value) 
     if key == make and model not in present_models: # condition to ensure update is not duplicate 
      database[key].extend((model,year,style,country)) 

下一點:你不走的事實,你的數據庫是一本字典的優勢。有通過所有的鍵值對不需要循環當我們知道什麼鍵我們感興趣的是我們可以做到以下幾點:。

def functionX (data_base,make,model,year,style,country): 
    if make in data_base: 
     present_models = set(data[0] for data in data_base[make]) 
     if model not in present_models: 
      database[make].extend((model,year,style,country)) 

    else: # make not found so we can just add the info without worrying about duplication 
     data_base[make] = [(model,year,style,country)] 

set(data[0] for data in data_base[make])創建一組廠名下的型號名稱。您可以將一個集合看作一個不包含重複項的列表。它提供了快速檢查項目是否在集合中(而列表中我們必須逐一檢查每個項目)。創建這個集合的語法在Python中使用列表理解,你可以在這裏閱讀:https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

最後,使用sort可以非常正常地完成排序。默認情況下,Python中的每個模型列表都包含元組和元組,按照字典順序排列(比較第一項,如果相等,則比較第二項等...)。我們希望列表根據元組中的第一項進行排序(所以我們可以在添加新項目後在列表中調用sort)。通常,您可以通過在sort上設置關鍵參數(例如sort(my_list, key=<some function>))來指定排序時使用的謂詞。

def functionX (data_base,make,model,year,style,country): 
    if make in data_base: 
     present_models = set(data[0] for data in data_base[make]) 
     if model not in present_models: 
      database[make].append((model,year,style,country)) 
      sort(database[make]) 
    else: # make not found so we can just add the info without worrying about duplication 
     data_base[make] = [(model,year,style,country)] 

我也改變extendappend,因爲你只添加一個項目。

如果我們利用模型列表已經排序的事實,該解決方案可以變得更高效。有了這個事實,我們可以在檢查模型是否存在以及插入新模型時執行二進制搜索。

+0

所以你說循環不是強制性的?自從我們有一本字典後,我有同樣的感覺! – Wanderer

+0

「present_models = set(data_base [make]中的數據的數據[0])」可以用簡單的語言來解釋這行代碼是什麼?我是一個初學者,當談到蟒蛇:) – Wanderer

+0

是的,一個字典的目的是要能夠訪問價值在大約不變的時間(即如此循環),當你知道值的確切關鍵,在這種情況下,你做。 – PeteyPii

1

我知道這可能是家庭作業,您不能使用此答案,但對於尋找正確方式的其他人,請使用set作爲值,並且它將自動僅保留唯一條目,並使用defaultdict(set)爲數據庫。然後你可以直接插入數據。如果該鍵不存在,defaultdict將隱式添加一個空集。那麼如果唯一,那麼set.add將插入新數據。

from collections import defaultdict 

data_base = defaultdict(set,{ 
    "Mercedes": set([("E-class", 1970, "classic", "Germany"), 
        ("Clk" , 2000, "sport" , "Poland")]), 
    "Fiat" : set([("Uno" , 1980, "coupe" , "Italy" )]), 
    "Jaguar" : set([("S-type" , 2000, "classic", "England"), 
        ("X-type" , 2005, "luxury" , "England")]) 
    }) 

def functionX(data_base,make,model,year,style,country): 
    data_base[make].add((model,year,style,country)) 

當然的數據也應消毒字符串的情況下,等「經典」和「經典」是不一樣的。