如何 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