2016-11-13 50 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)) 

当然的数据也应消毒字符串的情况下,等“经典”和“经典”是不一样的。