如何 return 输入元组包含空集的函数?
How to return a function where the input tuple contains an empty set?
CATALOGUE = {("table", 9999, 20), ("chair", 2999, 5), ("lamp", 1999, 10)}
def add_item_to_order(name, quantity, order):
number=0
lookup=[]
new={}
catlist=list(CATALOGUE)
for item in name, quantity, order:
for item in order:
lookup=list(order)
for cat in catlist:
if name==lookup[0][0]:
newnumber=number+quantity+lookup[0][1]
new={(lookup[0][0],newnumber,lookup[0][2],lookup[0][3])}
elif name in cat and len(lookup)!=0:
new={(lookup[0][0],lookup[0][1],lookup[0][2],lookup[0][3]),(cat[0],quantity,cat[1],cat[2])}
elif name in cat and len(lookup)==0:
new={(cat[0],quantity,cat[1],cat[2])}
return new
else:
raise KeyError
add_item_to_order("table", 1, set())
我有一个作业,其中将具有名称、数量和顺序(一组)的元组输入到函数中。根据订单是否匹配名称,函数 return 一个新的集合,例如{("table"(name),1 (quantity), 9999(price in pence), 20 (weight)},其中更新了数量。
如果名称与订单不匹配并且名称与目录匹配,那么这将生成一组两个元组,例如 {('chair', 1, 2999, 5), ('table', 1, 9999 , 20)}。如果输入的顺序集合为空,则 CATALOG 中与输入中的名称匹配的一组元组是 returned,例如对于上面的代码,应该 return {("table", 1, 9999, 20}。上面的代码能够用于第一个两个条件,但是 returns 一个 Nonetype 如果有输入中显示的空订单集。我想知道如何解决这个问题?
您应该在每次循环中向 new
添加项目,而不是替换整个变量。
return new
应该在函数的末尾,而不是在循环内。
并且new
应该初始化为集合,而不是字典。
for item in name, quantity, order:
完全没有意义。您可以使用 for item in order:
或 for name, quantity, price, weight in order:
。您也不需要嵌套循环,只需要 order
.
一个循环
我不明白你为什么要将 order
转换为列表然后只测试 lookup[0]
。您应该在循环中使用 item
,而不是 order
。
您无需将 CATALOGUE
转换为列表即可对其进行迭代。
def add_item_to_order(name, quantity, order):
new = set()
name_matched = False
for oname, oquantity, oprice, oweight in order:
if oname == name:
name_matched = True
new.add((name, oquantity + quantity, oprice, oweight))
else:
new.add((name, oquantity, oprice))
if not name_matched:
for cname, cprice, cweight in CATALOGUE:
if cname == name:
new.add((name, quantity, cprice, cweight))
break
else:
raise KeyError(f"{name} not found in CATALOGUE")
return new
CATALOGUE = {("table", 9999, 20), ("chair", 2999, 5), ("lamp", 1999, 10)}
def add_item_to_order(name, quantity, order):
number=0
lookup=[]
new={}
catlist=list(CATALOGUE)
for item in name, quantity, order:
for item in order:
lookup=list(order)
for cat in catlist:
if name==lookup[0][0]:
newnumber=number+quantity+lookup[0][1]
new={(lookup[0][0],newnumber,lookup[0][2],lookup[0][3])}
elif name in cat and len(lookup)!=0:
new={(lookup[0][0],lookup[0][1],lookup[0][2],lookup[0][3]),(cat[0],quantity,cat[1],cat[2])}
elif name in cat and len(lookup)==0:
new={(cat[0],quantity,cat[1],cat[2])}
return new
else:
raise KeyError
add_item_to_order("table", 1, set())
我有一个作业,其中将具有名称、数量和顺序(一组)的元组输入到函数中。根据订单是否匹配名称,函数 return 一个新的集合,例如{("table"(name),1 (quantity), 9999(price in pence), 20 (weight)},其中更新了数量。 如果名称与订单不匹配并且名称与目录匹配,那么这将生成一组两个元组,例如 {('chair', 1, 2999, 5), ('table', 1, 9999 , 20)}。如果输入的顺序集合为空,则 CATALOG 中与输入中的名称匹配的一组元组是 returned,例如对于上面的代码,应该 return {("table", 1, 9999, 20}。上面的代码能够用于第一个两个条件,但是 returns 一个 Nonetype 如果有输入中显示的空订单集。我想知道如何解决这个问题?
您应该在每次循环中向 new
添加项目,而不是替换整个变量。
return new
应该在函数的末尾,而不是在循环内。
并且new
应该初始化为集合,而不是字典。
for item in name, quantity, order:
完全没有意义。您可以使用 for item in order:
或 for name, quantity, price, weight in order:
。您也不需要嵌套循环,只需要 order
.
我不明白你为什么要将 order
转换为列表然后只测试 lookup[0]
。您应该在循环中使用 item
,而不是 order
。
您无需将 CATALOGUE
转换为列表即可对其进行迭代。
def add_item_to_order(name, quantity, order):
new = set()
name_matched = False
for oname, oquantity, oprice, oweight in order:
if oname == name:
name_matched = True
new.add((name, oquantity + quantity, oprice, oweight))
else:
new.add((name, oquantity, oprice))
if not name_matched:
for cname, cprice, cweight in CATALOGUE:
if cname == name:
new.add((name, quantity, cprice, cweight))
break
else:
raise KeyError(f"{name} not found in CATALOGUE")
return new