2016-03-21 3 views
1

я делаю функцию, которая позволит создать объединение своего рода, для значения, если ввести его внутри функции это сам:Получение значений из нескольких набора внутри словаря

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

Вы можете предоставить требуемый результат для наглядности? –

+0

, и вы пытались напечатать что-то внутри 'if' – Ilja

+0

да, из-за моего плохого: желаемый результат будет: например. item = ball, поэтому перед ним должен быть {«лопата», «стул», «пул», «корзина»} – Jervis

ответ

1

Ошибка в вашем коде заключается в том, что вы возвращаете value_unit = set() для каждого клиента по очереди. Таким образом, ваш результат будет только результатом, применимым к «последнему» клиенту, а не всем клиентам.

Для примера данных, ваш код на самом деле делает не возвращать пустое множество, то она возвращает (для меня) set(['basket', 'chair']) в Python 2 и {'shovel', 'pool'} в Python 3. Так как в сторону, две разные версии 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} 
+0

ОК, перемещая его из цикла for, ничего не меняет, я пробовал. – Jervis

+0

@ Джервис: вытащить его из петли исправляет это для меня. Вы должны более внимательно изучить ваш тестовый код: вы сообщаете, что он возвращает пустые множества, если это не так, и что изменение не имеет значения, когда это необходимо. Является ли ваш тестовый код * идентичным * коду, который вы опубликовали, или есть какая-то разница, которая объясняет, почему вы не видите тех же результатов, которые я вижу, запустив код, который вы опубликовали? –

+0

i literaly скопировал ваш код, и он все еще возвращает set(). У меня есть версия 4.5.4, если эта помощь или что-то изменит – Jervis

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: OK, после того, как вы предоставили результат, есть исправленный код:

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)) 

Edit 2. Да, решение, предоставляемое Steve Джессоп является более кратким, так как она удаляет элемент в результате набора. Это немного лучше:

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} 
+0

да, но это не то, что им нужно здесь. я просто получаю в результате словарь без элемента, который я вставляю. Мне нужен набор предметов, которые покупали люди, которые купили этот товар. – Jervis

Смежные вопросы