【问题标题】:How to return a function where the input tuple contains an empty set?如何返回输入元组包含空集的函数?
【发布时间】:2021-08-27 14:53:44
【问题描述】:
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())

我有一个任务,其中一个包含名称、数量和顺序(一组)的元组被输入到一个函数中。根据订单是否与名称匹配,该函数返回一个新集合,例如{("table"(name),1 (quantity), 9999(price in pence), 20 (weight)},这里更新了数量。 如果名称与顺序不匹配并且名称与目录匹配,则生成一组两个元组,例如{('chair', 1, 2999, 5), ('table', 1, 9999, 20)} .如果按顺序输入的集合为空,则返回 CATALOG 中与输入中的名称匹配的一个元组的集合,例如对于上面的代码应该返回 {("table", 1, 9999, 20}。上面的代码能够在第一个两个条件下工作,但是如果输入中有一个空的 order 集,则返回 Nonetype,如输入。我想知道如何解决这个问题?

【问题讨论】:

  • new={} 创建一个空字典,而不是一个空集。使用new=set() 创建一个空集。
  • 您总是在for 循环的第一次迭代中从函数返回。这可能不是你想要的。
  • 我不明白第二种情况。为什么只是添加table,结果中会出现chair

标签: python list function set tuples


【解决方案1】:

您应该每次通过循环向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

【讨论】:

  • 感谢您的帮助。为糟糕的代码道歉,因为我在这方面相对较新。当名称不是 name_matched 时,恐怕您的代码不起作用。它会抛出一个 KeyError 错误,名称在 CATALOGUE 中找不到,即使名称在 CATALOGUE 中也是如此。
  • 我忘记了break 声明。现在它应该可以工作了。
  • 感谢您的帮助。
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2020-11-08
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
相关资源
最近更新 更多