从字典中的几个集合中获取值

时间:2016-03-21 19:27:31

标签: python dictionary

我正在创建一个函数,如果你在自己的函数中输入一个值,就会创建一个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

为了进一步说明,我的目的是制作一个集合,其中所有项目将等于已购买项目的所有客户购买的项目,当然减去该项目。现在我可能会完全按照错误的方向工作,但我不知道如何解决这个问题,因为有了这个,它只是不断返回空集。

2 个答案:

答案 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}