我正在创建一个函数,如果你在自己的函数中输入一个值,就会创建一个sort的联合:
dict = {"Mike" : {"shovel", "ball", "pool"},
"Betty" : {"ball", "chair", "basket"}}
def bought_next(customers, item):
for i in customers:
value_unit = set()
if item in customers[i]:
value1 = customers[i]
value1.remove(item)
value_unit |= value1
return value_unit
为了进一步说明,我的目的是制作一个集合,其中所有项目将等于已购买项目的所有客户购买的项目,当然减去该项目。现在我可能会完全按照错误的方向工作,但我不知道如何解决这个问题,因为有了这个,它只是不断返回空集。
答案 0 :(得分:1)
代码中的错误是您依次为每个客户重置value_unit = set()
。因此,您的结果只会是适用于“最后”客户的结果,而不是所有客户的总和。
对于您的示例数据,您的代码实际上不返回空集,它返回(对我来说)Python 2中的set(['basket', 'chair'])
和Python 3中的{'shovel', 'pool'}
。所以除此之外,两个不同版本的Python以不同的顺序迭代字典。
在任何情况下,您最好在最后删除项目,而不是每次删除它。您当前的代码修改了传入的字典,这可能不是预期的。例如,你可以得到你想要的结果:
def bought_next(customers, item):
value_unit = set()
for values in customers.values():
if item in values:
value_unit |= values
return value_unit - {item}
答案 1 :(得分:0)
我想,你需要这样的东西:
bought = {"Mike" : {"shovel", "ball", "pool"},
"Betty" : {"ball", "chair", "basket"}}
def bought_next(customers, item):
return {c: s - {item} for c, s in bought.items() if c in customers}
结果:
In [6]: bought_next(['Mike', 'Betty'], 'ball')
Out[6]: {'Betty': {'basket', 'chair'}, 'Mike': {'pool', 'shovel'}}
顺便说一句,覆盖关键字(例如dict
编辑1: 好的,在您提供结果后,有更正的代码:
import itertools
bought = {"Mike" : {"shovel", "ball", "pool"},
"Betty" : {"ball", "chair", "basket"}}
def bought_next(customers, item):
other_then_item = [s - {item} for c, s in bought.items() if c in customers]
return set(itertools.chain(*other_then_item))
编辑2。 是的,Steve Jessop提供的解决方案更简洁,因为它删除了结果集中的项目。这有点好:
def bought_next(customers, item):
all_items = [s for c, s in bought.items() if c in customers]
return set(itertools.chain(*all_items)) - {item}