这个函数应该遍历字典(数据库):
{ 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 :(得分:1)
循环data_base.items()
时,value
不是您认为的那样。它是与汽车制造相关的模型列表。例如。密钥[("Uno" , 1980, "coupe" , "Italy")]
的{{1}}。因此,在检查重复模型时,您需要遍历该列表以确保找不到该模型:
'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)]
在make下创建一组模型名称。您可以将集合视为不包含重复项的列表。它可以快速检查项目是否在集合中(而对于列表,我们必须逐个检查每个项目)。创建此集合的语法使用Python中的list-comprehension,您可以在这里阅读:https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions。
最后,使用set(data[0] for data in data_base[make])
可以非常正常地进行排序。每个模型列表都包含元组和元组按字典顺序排序(第一个项目进行比较,如果它们相等,第二个项目进行比较,依此类推......)默认情况下在Python中。我们希望列表按照元组中的第一项(模型)进行排序,这样我们就可以在添加新项目后在列表上调用sort
。通常,您可以通过在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)]
更改为extend
,因为您只添加了一个项目。
如果我们利用已经对模型列表进行排序的事实,则可以使该解决方案更有效。有了这个事实,我们可以在检查模型是否存在以及插入新模型时执行二进制搜索。
答案 1 :(得分: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))
当然,对于字符串案例等也应对数据进行消毒。&#39; classic&#39;和经典&#39;不一样。